• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0
            之前有借助于 STL 中的 multimap 實(shí)現(xiàn)查找最小的 k 個(gè)元素。
            這里繼續(xù)解決 查找最小的 k 個(gè)元素,采用 最大根堆。

              1 #include <iostream>
              2 #include <ctime>
              3 #include <vector>
              4 using namespace std;
              5 
              6 class Heap
              7 {
              8 private:
              9     int* data;
             10     int  _size;
             11     int  _capacity;
             12 public:
             13     Heap()
             14     {
             15         _size = 0;
             16         _capacity = 2 * _size;
             17         data = new int[_capacity];
             18         if (data == 0)
             19         {
             20             exit(1);
             21         }
             22     }
             23     Heap(const Heap& h)
             24     {
             25         _size = h._size;
             26         _capacity = h._capacity;
             27         data = new int[_capacity];
             28         if (data == 0)
             29         {
             30             exit(1);
             31         }
             32         memcpy(data, h.data, sizeof (int* h._size);
             33     }
             34     Heap& operator =(const Heap& h)
             35     {
             36         delete [] data;
             37         _size = h._size;
             38         _capacity = h._capacity;
             39         data = new int[_capacity];
             40         if (data == 0)
             41         {
             42             exit(1);
             43         }
             44         memcpy(data, h.data, sizeof (int* h._size);
             45     }
             46     ~Heap()
             47     {
             48         delete [] data;
             49     }
             50     void insert(int item)
             51     {
             52         if (_size >= _capacity - 1)
             53         {
             54             _capacity = (_capacity + 1* 2;
             55             int * tmp = new int[_capacity];
             56             if (tmp == 0)
             57             {
             58                 exit(1);
             59             }
             60             // 1
             61             memcpy(tmp, data, sizeof (int* _capacity / 2 - 1);
             62             delete [] data;
             63             data = tmp;
             64         }
             65         data[++_size] = item;
             66         int pos1 = _size;
             67         int pos2 = pos1 / 2;
             68         while (pos2 >= 1 && data[pos1] > data[pos2])
             69         {
             70             data[pos1] ^= data[pos2];
             71             data[pos2] ^= data[pos1];
             72             data[pos1] ^= data[pos2];
             73             pos1 = pos2;
             74             pos2 = pos1 / 2;
             75         }
             76     }
             77     int max()
             78     {
             79         return data[1];
             80     }
             81     int erase()
             82     {
             83         int tmp = data[1];
             84         data[1= data[_size];
             85         --_size;
             86         int pos1 = 1, pos2;
             87         pos2 = pos1 * 2;
             88         
             89         while (pos2 <= _size)
             90         {
             91             if (pos2 < _size && data[pos2 + 1> data[pos2])
             92             {
             93                 ++pos2;
             94             }
             95             if (data[pos1] < data[pos2])
             96             {
             97                 data[pos1] ^= data[pos2];
             98                 data[pos2] ^= data[pos1];
             99                 data[pos1] ^= data[pos2];
            100             }
            101             pos1 = pos2;
            102             pos2 = pos1 * 2;
            103         }
            104         return tmp;
            105     }
            106     int size()
            107     {
            108         return _size;
            109     }
            110     int capacity()
            111     {
            112         return _capacity;
            113     }
            114     void test()
            115     {
            116         for (int i = 1; i <= _size; ++i)
            117         {
            118             cout << data[i] << ' ';
            119         }
            120         cout << endl;
            121     }
            122 };
            123 
            124 void findMinK(Heap& h, int k, const vector<int>& data)
            125 {
            126     int m = 0;
            127     for (vector<int>::const_iterator cit = data.begin(); cit != data.end(); ++cit)
            128     {
            129         if (m < k)
            130         {
            131             h.insert(*cit);
            132             ++m;
            133         }
            134         else
            135         {
            136             if (*cit < h.max())
            137             {
            138                 h.erase();
            139                 h.insert(*cit);
            140             }
            141         }
            142     }
            143 }
            144 
            145 int main()
            146 {
            147     int n = 100;
            148     Heap h;
            149     vector<int> data;
            150     srand(time(0));
            151     while (n--)
            152     {
            153         data.push_back(rand());
            154     }
            155     findMinK(h, 10, data);
            156     for (vector<int>::const_iterator cit = data.begin(); cit != data.end(); ++cit)
            157     {
            158         cout << *cit << ' ';
            159     }
            160     cout << endl;
            161     for (int i = 0; i < 10++i)
            162     {
            163         cout << h.erase() << endl;
            164     }
            165     cout << endl;
            166     return 0;
            167 }
            posted on 2011-04-27 00:03 unixfy 閱讀(232) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            精品久久无码中文字幕| 亚洲国产一成久久精品国产成人综合| 精品久久久久久国产潘金莲| 国内精品久久久久影院日本| 爱做久久久久久| 99精品久久精品一区二区| 青青草国产精品久久| 久久午夜无码鲁丝片秋霞| 精品久久久久久久| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 久久久WWW成人| 久久亚洲私人国产精品vA| 99久久精品免费看国产| 亚洲精品美女久久777777| 99久久精品免费看国产免费| 亚洲精品乱码久久久久久久久久久久 | 狠色狠色狠狠色综合久久| 欧美亚洲国产精品久久| 99久久www免费人成精品| 亚洲国产另类久久久精品| 久久一本综合| 国产免费福利体检区久久| 狠狠色婷婷综合天天久久丁香| 久久WWW免费人成一看片| 久久久久亚洲AV成人网| 精品久久一区二区三区| 午夜精品久久久久久中宇| 狠狠色丁香婷婷久久综合五月| 久久国产精品免费一区二区三区| 久久精品人成免费| 久久精品国产清高在天天线| 无码日韩人妻精品久久蜜桃| 99久久99久久精品国产片果冻| 91麻豆国产精品91久久久| 久久乐国产综合亚洲精品| 亚洲欧美精品一区久久中文字幕| 久久精品无码一区二区三区免费 | 伊人久久大香线蕉综合Av| 国产69精品久久久久观看软件 | 国内精品久久久久国产盗摄| 久久久青草青青亚洲国产免观|