当前位置: 首页 > news >正文

手机网站按那个尺寸做江苏企业seo推广

手机网站按那个尺寸做,江苏企业seo推广,logo设计公司排行榜,做淘宝的网站有哪些内容自己写一个堆首先,明确一下,为什么需要堆?>考虑插入,删除,查找的效率。数组,查找,最快是二分查找O(lgN)。但查找完如果要做什么操作,比如删除,就要挪动元素了。所以合…
  1. 自己写一个堆

首先,明确一下,为什么需要堆?

=>考虑插入,删除,查找的效率。

数组,查找,最快是二分查找O(lgN)。但查找完如果要做什么操作,比如删除,就要挪动元素了。所以合起来效率是O(lgN)+O(N)=O(N)

二叉树,看起来是O(lgN),但之前写树的时候有说过,链表是不是树?是树的退化形态,每个结点都有小于等于一个的儿子。这个时候查找的效率是O(lgN)了。之前说,查找之后万一要做什么操作,树就可能不是完全二叉树,即查找效率为O(lgN)。

能不能试图用平衡二叉树?不能,rotate非常麻烦。

=>所以尝试保持一颗完全二叉树=>给这棵树起名堆。

接下来考虑需要用什么基础的数据结构存储。

需要指针吗?

完全二叉树是每一个结点要么没有儿子,要么有两个儿子,在堆里只有最后一个有儿子的父节点可以只有左儿子。所以完全可以用数组表示。

假如链表下标从1开始,2和3是它的子节点,2/2=1,3/2=1,父节点访问也很方便。

  1. 初始化

表示这棵树需要几个数据:总容量,现在有多少元素,以及存放元素的数组。

初始化需要提供总容量。

  1. 插入元素

为确保是一个完全二叉树,插在最后。

堆需要确保一件事情,小元素在上,大元素在下。所以需要向上进行一次数据交换,寻找插入值的最终位置。

注意,这里说的是寻找,不需要真的交换,只需要挪动不符合要求的元素,找到插入值的最终位置赋值即可。

  1. 删除元素

删除一定是删最小的。其余和插入一样。

为确保是一个完全二叉树,将最后一个元素和被删除的第一个元素交换,然后向下寻找最终位置。

4. 一个数组的插入

为了保证堆的性质,插入数组后需要排序。

思考一下,哪些需要排序?

如果向下调整位置,则叶子结点不需要轮。如果向上调整位置,则根节点不需要轮。

效率为重,叶子结点最多,如果向上调整,则叶子结点需要轮的距离最远。而事实上,叶子结点又占了树结点的很大一部分。

所以我们选择向下调整。

完整代码(包括测试)

#include<iostream>
using namespace std;
class h{
private:int *nums;int capacity;int l;
public:h(){capacity=0;}void init(int c=1){capacity=c;l=0;nums=new int [c+1];}void printh(){for(int i=1;i<=l;i++){cout<<nums[i]<<" ";}cout<<endl;}int isfull(){if(capacity==l){return 1;}return 0;}void moveup(int k){int tempnum=nums[k];int i=k;for(i;tempnum<nums[i/2]&&i>1;i/=2){nums[i]=nums[i/2];}nums[i]=tempnum;}int insert(int n){if(isfull()){return 0;}nums[l+1]=n;l++;moveup(l);return 1;}int isempty(){if(l==0){return 1;}return 0;}void movedown(int k){int tempnum=nums[k];int i=k;while(i*2<=l){int child=i*2;if(child<l){if(nums[child]>nums[child+1]){child++;}}if(nums[child]<tempnum){nums[i]=nums[child];i=child;}else{nums[i]=tempnum;return ;}}nums[i]=tempnum;return ;}int remove(){if(isempty()){return 0;}nums[1]=nums[l];l--;movedown(1);return 1;}void buildheap(int *a,int len,int c=0){if(len>c){c=len;}init(c);l=len;for(int i=0;i<len;i++){nums[i+1]=a[i];}for(int i=len/2;i>=1;i--){movedown(i);}}
};
int main(){int a[6]={10,50,60,5,30,20};h h1;h1.buildheap(a,6);h1.printh();
}

2. c++的堆

堆在queue中,叫priority_queue,默认是大顶堆,即树根是最大的元素,可以执行一下验证。

所以插入是push,查看堆顶元素是top(),弹出堆顶是pop()。

#include<iostream>
#include<queue>
using namespace std;
int main(){priority_queue<int>q1;int a[6]={111,222,333,11,22};for(int i=0;i<5;i++){q1.push(a[i]);}cout<<q1.top()<<endl;q1.pop();cout<<q1.top()<<endl;
}

堆额外有一种方法让其变为小顶堆,即提供一个容器,前提是这个容器支持从小到大排序,比如vector。

可以借助以下程序验证。

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main(){priority_queue<int,vector<int>,greater<int> >q1;int a[5]={111,222,333,11,22};for(int i=0;i<5;i++){q1.push(a[i]);}for(int i=0;i<5;i++){cout<<q1.top()<<endl;q1.pop();}
}

3. c++的集合

集合就是set嘛,之前刷题用了好多次了。

注意三点:

  1. set默认从小到大排序(因为底层实现是红黑树,类似AVL树)

  1. set.insert()也可以插入集合,方法详见下方实验代码

  1. 对于力扣中要求返回vector但你用set做了,只要返回{set.begin(), set.end()}即可

可以用以下代码验证set

#include<iostream>
#include<set>
using namespace std;
int main(){set<int>s1;int a1[3]={333,222,111};for(int i=0;i<3;i++){s1.insert(a1[i]);}for(auto x:s1){cout<<x<<" ";}cout<<endl;set<int>s2;s2.insert(666);s2.insert(555);s1.insert(s2.begin(),s2.end());for(auto x:s1){cout<<x<<" ";}cout<<endl;
}
http://www.yayakq.cn/news/159681/

相关文章:

  • 自己做的网站访问不了建网站做优化
  • 门户网站建设 增强责任意识国内广告公司排行
  • 在招聘网站做电话销售怎么样win10优化大师
  • 四川住房和城乡建设厅网站三类人员云南网站设计平台
  • 西安网站到首页排名营销推广网站
  • 高端网站建设jm3q深圳工程建设服务网
  • seo优化网站推广专员招聘修改wordpress密码
  • 深圳外贸网站开发建设html5 jsp做网站可以么
  • 云南网站定制网站商城建设的维度
  • 公司的帐如何做网站jsp网站开发四酷全书
  • 网站建设开题报告ppt模板免费的制作手机网站平台
  • 泰州网站模板网站建设 就业方向
  • 网站建设可视化diy网站建设系统源码
  • 手机网站翻页底时自动链接网络技术公司
  • 恩施哪里有做网站的石家庄新闻综合频道回看今天
  • 网站正在建设中亚洲移动互联网终端设备的主要技术指标是什么
  • 百度网站网址是多少简易微网站模板
  • 大良营销网站建设流程资源网站怎样做
  • 做网站设计需求杨小刀网站建设
  • 北京中兴时代网站建设东莞现代建设有限公司
  • 云南网站营销电子商务网站建设 大纲
  • 安徽网站建设SEO优化制作设计公司app网站与普通网站的区别
  • 垂直汽车网站做电商的优势hqz行情站
  • 我想做网站怎么做中国字体设计
  • 关于网站建设的报告上海物流公司网站建设
  • 网站固定头部图库下载网站源码
  • 吉林省级建设行政主管部门政务网站张家界建设信息网站
  • 物流网站建设计划书怎么找人做网站
  • 随机网站生成器下载牛霸软件
  • 大学生网站开发总结报告网络营销方案定义思路