亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

一、問(wèn)題描述

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

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

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

二、位圖排序思想

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

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

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

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

這樣排序過(guò)程自然可以分為三步:

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

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

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

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

偽代碼如下:

/*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 

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

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

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

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

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

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

下面我們使用bitset容器進(jìn)行位圖排序:

/************************************************************************* 
  > 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; 
   
  /* 將對(duì)應(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++的程序流程控制

    一文詳解C++的程序流程控制

    這篇文章主要介紹了一文詳解C++的程序流程控制,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • C語(yǔ)言實(shí)現(xiàn)文件版通訊錄的代碼分享

    C語(yǔ)言實(shí)現(xiàn)文件版通訊錄的代碼分享

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)文件版通訊錄,主要運(yùn)用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語(yǔ)句等等知識(shí),需要的可以參考一下
    2023-01-01
  • C語(yǔ)言實(shí)現(xiàn)txt數(shù)據(jù)讀入內(nèi)存/CPU緩存實(shí)例詳解

    C語(yǔ)言實(shí)現(xiàn)txt數(shù)據(jù)讀入內(nèi)存/CPU緩存實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)txt數(shù)據(jù)讀入內(nèi)存/CPU緩存實(shí)例詳解的相關(guān)資料,這里對(duì)實(shí)現(xiàn)該函數(shù)進(jìn)行了代碼實(shí)現(xiàn),需要的朋友可以參考下
    2017-01-01
  • 詳解C++ bitset用法

    詳解C++ bitset用法

    這篇文章主要介紹了C++ bitset用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C++中this指針的用法及介紹

    C++中this指針的用法及介紹

    以下是對(duì)C++中this指針的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • C++實(shí)現(xiàn)Date類(lèi)各種運(yùn)算符重載的示例代碼

    C++實(shí)現(xiàn)Date類(lèi)各種運(yùn)算符重載的示例代碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)Date類(lèi)各種運(yùn)算符重載的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C語(yǔ)言函數(shù)的遞歸調(diào)用詳情

    C語(yǔ)言函數(shù)的遞歸調(diào)用詳情

    這篇文章主要介紹了C語(yǔ)言函數(shù)的遞歸調(diào)用詳情,遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用,主要的思考方式就是大事化小,下文具體的相關(guān)介紹,需要的小伙伴可以參考一下
    2022-04-04
  • C/C++中的typedef和#define詳解

    C/C++中的typedef和#define詳解

    這篇文章主要介紹了C/C++中的typedef和#define詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C++中引用處理的基本方法

    C++中引用處理的基本方法

    引用不是新定義了一個(gè)變量,而是給已經(jīng)存在的變量取了一個(gè)別名,編譯器不會(huì)為引用變量開(kāi)辟內(nèi)存空間,他和他引用的變量共用一塊內(nèi)存空間,下面這篇文章主要給大家介紹了關(guān)于C++中引用處理的基本方法,需要的朋友可以參考下
    2022-12-12
  • MongoDB?C?驅(qū)動(dòng)程序安裝(libmongoc)?和?BSON?庫(kù)(libbson)方法

    MongoDB?C?驅(qū)動(dòng)程序安裝(libmongoc)?和?BSON?庫(kù)(libbson)方法

    這篇文章主要介紹了安裝?MongoDB?C?驅(qū)動(dòng)程序?(libmongoc)?和?BSON?庫(kù)?(libbson),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09

最新評(píng)論