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

百度网站建设工资给城市建设提议献策的网站

百度网站建设工资,给城市建设提议献策的网站,河南住房和城乡建设厅网站特种,ps做网站视图大小文章目录 堆排序堆排序的实现 TopK问题用堆实现TopK的时间复杂度TopK问题的实现 萌新的学习笔记#xff0c;写错了恳请斧正。 堆排序 堆排序#xff0c;就是利用堆的思想进行排序#xff0c;是一种非常高效的排序方法。 它的基本思想是将待排序的序列构建成一个堆#xf… 文章目录 堆排序堆排序的实现 TopK问题用堆实现TopK的时间复杂度TopK问题的实现 萌新的学习笔记写错了恳请斧正。 堆排序 堆排序就是利用堆的思想进行排序是一种非常高效的排序方法。 它的基本思想是将待排序的序列构建成一个堆这样序列的最大最小值就是堆顶的根节点。将其与堆的最后一个元素交换然后将剩余的 n-1 个元素的序列重新构建成一个堆这样就会得到 n 个元素的次大小值。如此反复执行便能得到一个有序序列。 基本步骤如下 建堆将序列构建成堆如果想要从大到小的序列就构建大根堆反正构建小根堆。交换将堆顶与最后一个元素交换然后将堆容量减一原堆顶不再视为堆中元素。向下调整对顶元素向下调整使得新的根节点为新堆的最大值。重复上述过程直到完全排序。 这个过程看起来似乎也不简单但是计算可发现其时间复杂度仅为 O ( n log ⁡ n ) O(n\log n) O(nlogn)空间复杂度仅为 O ( 1 ) O(1) O(1)。 注意堆排序是一种不稳定的原地排序算法在进行堆顶和堆尾元素的交换时可能会破坏相同元素的相对顺序。 堆排序的实现 #include stdio.h #include stdlib.h #include time.h//#define MIN_HEAP #define MAX_HEAP#ifdef MIN_HEAP #define HEAP_COMPARE(a, b) ((a) (b)) #endif // MIN_HEAP - 排序后由大到小 #ifdef MAX_HEAP #define HEAP_COMPARE(a, b) ((a) (b)) #endif // MAX_HEAP - 排序后由小到大typedef int HPDataType;void Swap(HPDataType* a, HPDataType* b) {HPDataType tmp *a;*a *b;*b tmp; }void AdjustUp(HPDataType* data, int child) {int parent (child - 1) / 2;while (child 0){if (HEAP_COMPARE(data[child], data[parent])){Swap(data[child], data[parent]);child parent;parent (child - 1) / 2;}else{break;}} }void AdjustDown(HPDataType* data, int size, int parent) {int child parent * 2 1;while (child size){if (child 1 size HEAP_COMPARE(data[child 1], data[child])){child;}if (HEAP_COMPARE(data[child], data[parent])){Swap(data[child], data[parent]);parent child;child parent * 2 1;}else{break;}} }void HeapSort(HPDataType* a, int n) {//建堆for (int i (n - 2) / 2; i 0; --i){AdjustDown(a, n, i);}//排序for (int i 0; i n; i){Swap(a[0], a[n - 1 - i]);AdjustDown(a, n - 1 - i, 0);} }//测试 int main() {printf(请输入要排序的数字个数);int n;scanf(%d, n);HPDataType* a (HPDataType*)malloc(sizeof(HPDataType) * n);//文件输入FILE* fp fopen(data.txt, r);if (fp NULL){printf(文件打开失败\n);return 0;}for (int i 0; i n; i){fscanf(fp, %d, a[i]);}fclose(fp);HeapSort(a, n);//文件输出fp fopen(output.txt, w);if (fp NULL){printf(文件打开失败\n);return 0;}for (int i 0; i n; i){fprintf(fp, %d\n, a[i]);}fclose(fp);free(a);return EXIT_SUCCESS; }生成随机数 //int main() //{ // srand((unsigned int)time(NULL)); // printf(请输入要生成的随机数个数); // int n; // scanf(%d, n); // // FILE* fp fopen(data.txt, w); // if (fp NULL) // { // printf(文件打开失败\n); // return 0; // } // for (int i 0; i n; i) // { // fprintf(fp, %d\n, rand()); // } // fclose(fp); // // return EXIT_SUCCESS; //}TopK问题 TopK就是求数据集合中前k个最大或者最小的数据。 比较好想到的办法就是排序然后取前面K个值但是如果数据量非常大排序就会变的不太可能无法全部加载到内存中。 而比较好的方式就是用堆来寻找TopK其思路如下 用数据集合中前K个元素来建堆 取前K个最大元素则建小堆取前K个最小元素则建大堆 用剩余的N-K个元素依次与堆顶元素比较如果不满足大小关系则替换堆顶元素并向下调整。 用堆实现TopK的时间复杂度 对于前K个元素构建堆的过程时间复杂度是 O ( K ) O(K) O(K)对于剩余的N-K个元素每个元素都需要和堆顶元素进行比较并可能需要插入堆中这个过程的时间复杂度是 O ( log ⁡ K ) O(\log K) O(logK)因为每次插入或删除堆顶元素都需要进行堆调整。所以对于所有的N-K个元素时间复杂度是 O ( ( N − K ) log ⁡ K ) O((N-K) \log K) O((N−K)logK)。 综合起来使用堆实现TopK的总时间复杂度是 O ( K ( N − K ) log ⁡ K ) O ( N log ⁡ K ) O(K (N-K) \log K) O(N \log K) O(K(N−K)logK)O(NlogK)。 TopK问题的实现 #include stdio.h #include stdlib.h #include string.h #include time.h#define MIN_HEAP //#define MAX_HEAP#ifdef MIN_HEAP #define HEAP_COMPARE(a, b) ((a) (b)) #endif // MIN_HEAP - 寻找前k个最大值 #ifdef MAX_HEAP #define HEAP_COMPARE(a, b) ((a) (b)) #endif // MAX_HEAP - 寻找前k个最小值void AdjustDown(int* arr, int size, int parent) {int child parent * 2 1;while (child size){if (child 1 size HEAP_COMPARE(arr[child 1], arr[child])){child;}if (HEAP_COMPARE(arr[child], arr[parent])){int temp arr[child];arr[child] arr[parent];arr[parent] temp;parent child;child parent * 2 1;}else{break;}} }void CreateNDate() {// 造数据int n 10000;srand((unsigned int)time(NULL));const char* file data.txt;FILE* fin fopen(file, w);if (fin NULL){perror(fopen error);return;}for (size_t i 0; i n; i){int x rand();fprintf(fin, %d\n, x);}fclose(fin); }void PrintTopK(int k) {FILE* fin fopen(data.txt, r);if (fin NULL){perror(fopen error);return;}int val 0;int* arr (int*)malloc(sizeof(int) * k);if (arr NULL){perror(malloc error);return;}for (int i 0; i k; i){fscanf(fin, %d, val);arr[i] val;}//前k个数建堆for (int i (k - 2) / 2; i 0; --i){AdjustDown(arr, k, i);}int x 0;while (fscanf(fin, %d, x) ! EOF){if (!HEAP_COMPARE(x, arr[0])){arr[0] x;AdjustDown(arr, k, 0);}}for (int i 0; i k; i){printf(%d , arr[i]);} }int main() {int k 0;printf(请输入要找的前k个数);scanf(%d, k);CreateNDate();PrintTopK(k);return 0; }
http://www.pierceye.com/news/131534/

相关文章:

  • 网站建设 公众号免费的网站怎么做
  • 深圳公司网站设计公太原企业网站建设
  • 营销型网站的分类公众号开发信息什么意思
  • 爱写作网站最佳wordpress主机
  • 东山网站制作一站式做网站费用
  • seo针对网站做策划外贸淘宝网站建设
  • 电商网站的建设与运营百度推广营销怎么做
  • 做网站的核验单 是下载的吗北京建设工程招标公告网站
  • 网站建设与维护试卷第九章各网站文风
  • 熊掌号网站的基础建设费用网站的建设ppt模板
  • 有口碑的坪山网站建设王野天 演员
  • 建e网怎么赚钱衡水网站优化
  • 做牙科设计的网站域名一定要备案才能用吗
  • 哪个网站做团购要求低点河北省住房和城乡建设厅网站
  • 华为商城网站建设世界杯大数据
  • 网站流量指标高埗镇仿做网站
  • 网站建设颊算校园网站的作用
  • 云南公司网站制作外贸网站推广外包
  • 甘肃住房建设厅的网站数据中心idc机房
  • wordpress开发视频网站模板下载wordpress qq 微信登录
  • 上海网站建设网站营销推广费计入什么科目
  • 云南培训网站建设网站建设的公司太多了
  • 洛阳网站建设招聘信息ppt设计师兼职
  • 建工网官方网站电子商务网站设计岗位主要是
  • 保险网站建设平台青岛设计公司排名
  • 伊利网站建设评价做的最好的宠物网站
  • 沈阳的网站制作公司哪家好常用设计资源网站
  • 做网站需要什么技术文化传媒公司 网站备案
  • 郑州市建设厅网站html5 网站开发定制
  • 网站制作网站建站公司用wordpress