在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 幾種查找數(shù)組的前K個(gè)最小值的算法

      幾種查找數(shù)組的前K個(gè)最小值的算法

      作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏

      /*創(chuàng)建最小堆*/
      void build_minheap(int *a, int size)
      {
      int i = PARENT(size);

      assert(a != NULL);

      for(; i >= 0; -- i)
      min_heapify(a, i, size - 1);
      }

      /*采用快速排序查找*/
      void find_Kmin_num_1(int *a , int size, int k)
      {
      int i = 0;

      assert(a != NULL);

      QuickSort(a, size);

      #if 0
      for(i = 0; i < k ; ++ i)
      printf("%d ",a[i]);

      printf("");
      #endif
      }

      /*采用快速選擇實(shí)現(xiàn)*/
      void find_Kmin_num_2(int *a, int size, int k)
      {
      int i = 0;

      assert(a != NULL);

      QuickSelect(a, size, k);

      #if 0
      for(i = 0; i < k ; ++ i)
      printf("%d ",a[i]);

      printf("");
      #endif
      }

      /*采用最大堆實(shí)現(xiàn)*/
      void find_Kmin_num_3(int *a, int size, int k)
      {
      int i = 0;

      int *b = malloc(sizeof(int)*k);

      assert(a != NULL && b != NULL);

      for(i = 0; i < k; ++ i)
      b[i] = a[i];

      build_maxheap(b,k);

      for(; i < size; ++ i)
      {
      if(a[i] < b[0])
      {
      b[0] = a[i];
      // build_maxheap(b , k);
      max_heapify(b,0,k - 1);
      }
      }
      #if 0
      for(i = 0; i < k ; ++ i)
      printf("%d ",b[i]);

      printf("");
      #endif
      }

      /*采用最小堆刪除元素的方式實(shí)現(xiàn)*/
      void find_Kmin_num_4(int *a ,int size, int k)
      {
      int i = 0;

      assert(a != NULL);

      build_minheap(a, size - 1);
      for(i = 0; i < k; ++ i)
      {
      // printf("%d ",a[0]);

      /*刪除a[0],釋放a[size - 1 - i]*/
      a[0] = a[size -1 - i];
      min_heapify(a, 0, size - 2 - i);
      }
      // printf("");
      }

      int main()
      {
      int a[LEN];
      int b[LEN];
      int c[LEN];
      int d[LEN];

      int i = 0,j = 0;

      clock_t _start;
      doubletimes = 0;

      srand((int)time(NULL));

      for(i = 0; i < LEN; ++ i)
      {
      a[i] = rand()%(LEN);
      b[i] = a[i];
      c[i] = a[i];
      d[i] = a[i];

      // printf("%d ",a[i]);
      }
      // printf("");

      _start = clock();
      find_Kmin_num_1(a,LEN,K);
      times = (double)(clock() - _start)/CLOCKS_PER_SEC;
      printf("快速排序的查找需要:%f",times);

      _start = clock();
      find_Kmin_num_2(b,LEN,K);
      times = (double)(clock() - _start)/CLOCKS_PER_SEC;
      printf("快速選擇的查找需要:%f",times);

      _start = clock();
      find_Kmin_num_3(c,LEN,K);
      times = (double)(clock() - _start)/CLOCKS_PER_SEC;
      printf("最大堆的查找需要:%f",times);

      _start = clock();
      find_Kmin_num_4(d,LEN,K);
      times = (double)(clock() - _start)/CLOCKS_PER_SEC;
      printf("最小堆的查找需要:%f",times);

      return 0;
      }

      檢測算法的性能:

      [gong@Gong-Computer interview]$ gcc -g minKnum.c -o minKnum
      [gong@Gong-Computer interview]$ ./minKnum
      快速排序的查找需要:0.130000
      快速選擇的查找需要:0.020000
      最大堆的查找需要:0.000000
      最小堆的查找需要:0.010000

      從結(jié)果可知,快速排序的算法效果最差,而最大堆的效果最好,最小堆的效果其次,但是最大堆運(yùn)用了額外的內(nèi)存空間。因此在內(nèi)存空間限制的情況下,考慮最小堆是比較合適的。但是最大堆的思想確實(shí)很精妙的,運(yùn)用了類似桶排序的性質(zhì)。

      為了說明算法能否實(shí)現(xiàn)前K個(gè)最小值的查找,改變數(shù)組大小為50,并打印各個(gè)方法完成的情況,查找前10個(gè)數(shù)據(jù),實(shí)驗(yàn)結(jié)果如下所示:

      [gong@Gong-Computer interview]$ ./minKnum
      15 38 14 43 31 45 42 1 32 23 43 34 9 4 45 31 25 48 8 42 40 27 36 30 32 4 11 23 47 12 24 14 1 40 8 32 36 0 35 18 26 28 2 35 35 49 17 12 48 27
      0 1 1 2 4 4 8 8 9 11
      快速排序的查找需要:0.000000
      1 9 4 8 4 11 1 8 0 2
      快速選擇的查找需要:0.000000
      11 8 9 4 2 1 8 1 4 0
      最大堆的查找需要:0.000000
      0 1 1 2 4 4 8 8 9 11
      最小堆的查找需要:0.000000

      從上面的實(shí)驗(yàn)結(jié)果可知,四種方法都是實(shí)現(xiàn)了獲得前K個(gè)最小元素。


      上一頁 1 2 下一頁

      關(guān)鍵詞: 查找數(shù)組最小值算

      評(píng)論


      技術(shù)專區(qū)

      關(guān)閉