最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)位圖排序?qū)嵗?/h1>
 更新時間:2014年08月14日 09:45:59   投稿:shichen2014  
這篇文章主要介紹了C++實現(xiàn)位圖排序,是比較重要的排序算法,需要的朋友可以參考下

在《編程珠璣》一書里提到了一種算法導(dǎo)論里沒有提到過的位圖排序方法,這種排序方法是通過犧牲空間效率來追求時間效率(線性時間)以達到時間-空間折中與雙贏的目的。本文以實例形式簡單講一下位圖排序思想。

一、問題描述

     1.輸入:一個至多包含1千萬個非負(fù)整數(shù)的文件

     2.特征:①每個數(shù)都是小于10000000的非負(fù)整數(shù);②沒有重復(fù)的數(shù)字;③數(shù)據(jù)之間不存在關(guān)聯(lián)關(guān)系。

     3.約束:①最多1MB的內(nèi)存空間可用;②磁盤空間充足;③運行時間最多幾分鐘,最好是線性時間。
    
     4.輸出:按升序排列的整數(shù)序列。

二、位圖排序思想

由于待排序的數(shù)據(jù)記錄較多,我們單純地使用常見的排序方法時間效率較低,運行時間會很長。而且內(nèi)存空間有限(限制為1MB左右),所以我們不能同時把所有整數(shù)讀入內(nèi)存(如果每個整數(shù)使用7個字節(jié)來存儲,那么1MB內(nèi)存空間只能存大約143000個數(shù)字)。當(dāng)然我們可以多次讀取輸入文件,多次排序,但是更好的方案是使用位圖排序,可以使用有限的1MB內(nèi)存空間并只進行一趟排序。

1.根據(jù)待排序集合中最大的數(shù),開辟一個位數(shù)組,用來表示待排序集合中的整數(shù);

2.待排序集合中的數(shù)字在位數(shù)組中的對應(yīng)位置置1,其他的置0;

例如,待排序集合{1,2,3,5,8,13}可以表示為:0-1-1-1-0-1-0-0-1-0-0-0-0-1

這樣排序過程自然可以分為三步:

第一步:將所有的位都置為0;

第二步:通過讀入文件中的每個整數(shù),將每個對應(yīng)的位都置為1;

第三步:檢驗每一位,如果該位為1,輸出對應(yīng)的整數(shù)。

注意:位圖排序是使用一個二進制位而不是一個整數(shù)來表示0或1,這樣可以大大地減少所需要的內(nèi)存空間。使用位圖排序的前提是要知道待排序序列中的最大數(shù)。位圖排序的缺點是有些數(shù)沒有出現(xiàn)過,仍要為其保留一個位。故位圖排序比較適合關(guān)鍵字密集的序列,例如一個城市的電話號碼。

偽代碼如下:

/*Phase 1: initialize set to empty*/ 
  for i = [0, n) 
    bit[i] = 0 
/*Phase 2: insert present elements into the set*/ 
  for each i in the input file 
    bit[i] = 1 
/*Phase 3: write sorted output*/ 
  for i = [0, n) 
    if bit[i] == 1 
      write i on the output file 

性能:時間復(fù)雜度可達O(n),1MB包含8*1024*1024個位,所需內(nèi)存10000000/(8*1024*1024)=1.20MB,如果不是嚴(yán)格限制的話可以看做基本符合要求。

三、位圖排序?qū)崿F(xiàn)

位圖排序時,我們需要考慮:給出一個數(shù),如何找到其對應(yīng)位圖的位置,方法就是首先找到該數(shù)對應(yīng)的字節(jié),然后在找到該數(shù)對應(yīng)的位。例如:

unsigned char bitmap[2]; 
/* 可以表示16個數(shù),即0~15 */ 

一個字節(jié)有八位,5表示第0個字節(jié)的第5位上;14表示第1個字節(jié)的第6個位上。

在這里為了簡化位處理,我們使用C++標(biāo)準(zhǔn)庫的bitset容器。bitset是C++提供的一種位集合的數(shù)據(jù)結(jié)構(gòu),它讓我們可以像使用數(shù)組一樣使用位,可以訪問指定下標(biāo)的bit位。和其他容器一樣,bitset也是一個模板類。具體的bitset方法可以查看std::bitset reference。

下面我們使用bitset容器進行位圖排序:

/************************************************************************* 
  > File Name: BitSort.cpp 
  > Author: SongLee 
 ************************************************************************/ 
#include<bitset> 
#include<iostream> 
using namespace std; 
 
#define MAX 20 
 
int main() 
{ 
  int arr[10] = {5,1,2,13,7,10,0,20,16,9}; 
 
  bitset<MAX+1> bit; 
   
  /* 將對應(yīng)位置置1 */ 
  for(int i=0; i<10; ++i) 
  { 
    bit.set(arr[i]); 
    /* bit.set(n)表示將第n位置1 */ 
  } 
 
  /* 輸出排序結(jié)果 */ 
  for(int i=0; i<MAX+1; ++i) 
  { 
    /* bit.test(n)判斷第n位是否為1 */ 
    if(bit.test(i)) 
    { 
      cout << i << " "; 
    } 
  } 
  cout << endl; 
} 

輸出結(jié)果:0 1 2 5 7 9 10 13 16 20

相關(guān)文章

  • C++?OpenCV實現(xiàn)物體尺寸測量示例詳解

    C++?OpenCV實現(xiàn)物體尺寸測量示例詳解

    本文主要介紹了利用OpenCV對物體的尺寸進行測量,即先定位到待測物體的位置,然后測量物體的寬高。感興趣的同學(xué)可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2022-01-01
  • C++實現(xiàn)學(xué)校運動會管理系統(tǒng)

    C++實現(xiàn)學(xué)校運動會管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)學(xué)校運動會管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • C語言模擬實現(xiàn)掃雷游戲

    C語言模擬實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語言模擬實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C語言經(jīng)典例程100例(經(jīng)典c程序100例)

    C語言經(jīng)典例程100例(經(jīng)典c程序100例)

    這篇文章主要介紹了C語言經(jīng)典例程100例,經(jīng)典c程序100例,學(xué)習(xí)c語言的朋友可以參考一下
    2018-03-03
  • C語言中各種運算類型全面總結(jié)

    C語言中各種運算類型全面總結(jié)

    C語言運算符是說明特定操作的符號,它是構(gòu)造C語言表達式的工具,C語言的運算異常豐富,除了控制語句和輸入輸出以外的幾乎所有的基本操作都為運算符處理
    2022-04-04
  • C語言預(yù)處理預(yù)編譯命令及宏定義詳解

    C語言預(yù)處理預(yù)編譯命令及宏定義詳解

    這篇文章主要為大家介紹了C語言預(yù)處理預(yù)編譯命令及宏定義的詳解,其中包含運行環(huán)境命名約定條件及#under等基礎(chǔ)詳解,有需要的朋友可以借鑒參考下
    2021-10-10
  • 數(shù)據(jù)結(jié)構(gòu)之位圖(bitmap)詳解

    數(shù)據(jù)結(jié)構(gòu)之位圖(bitmap)詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之位圖詳解,本文講解了位圖的基本知識、位圖的實現(xiàn)方法、位圖的應(yīng)用等內(nèi)容,需要的朋友可以參考下
    2014-08-08
  • 一篇文章徹底弄懂C++虛函數(shù)的實現(xiàn)機制

    一篇文章徹底弄懂C++虛函數(shù)的實現(xiàn)機制

    C++中的虛函數(shù)的作用主要是實現(xiàn)了多態(tài)的機制,基類定義虛函數(shù),子類可以重寫該函數(shù),在派生類中對基類定義的虛函數(shù)進行重寫時,需要在派生類中聲明該方法為虛方法,這篇文章主要給大家介紹了關(guān)于如何通過一篇文章徹底弄懂C++虛函數(shù)的實現(xiàn)機制,需要的朋友可以參考下
    2021-06-06
  • C語言 ffmpeg與sdl實現(xiàn)播放視頻同時同步時鐘詳解

    C語言 ffmpeg與sdl實現(xiàn)播放視頻同時同步時鐘詳解

    使用ffmpeg和sdl實現(xiàn)播放視頻后,需要再實現(xiàn)時鐘同步才能正常的播放視頻,尤其是有音頻的情況,我們通常需要將視頻同步到音頻來確保音畫同步
    2022-09-09
  • C++算法系列之日歷生成的算法代碼

    C++算法系列之日歷生成的算法代碼

    日歷算法首先要知道日歷的編排規(guī)則,也就是歷法。所謂歷法,指的就是推算年、月、日的時間長度和它們之間的關(guān)系,指定時間序列的法則。
    2018-05-05

最新評論

河西区| 芜湖县| 通化市| 开原市| 左贡县| 津市市| 焉耆| 曲麻莱县| 元江| 东安县| 花莲县| 大余县| 读书| 苏尼特左旗| 界首市| 白水县| 马鞍山市| 八宿县| 神木县| 东阳市| 九龙坡区| 斗六市| 阳新县| 花垣县| 三亚市| 梁河县| 潮州市| 内黄县| 鹿邑县| 南江县| 安陆市| 吉林省| 铜梁县| 濉溪县| 荃湾区| 呼图壁县| 江川县| 雅江县| 大田县| 高雄县| 余干县|