程式設計師程式設計藝術 第二章筆記

2021-06-18 00:10:55 字數 1931 閱讀 1758

誤中陣列o(m+n)演算法。。。

void note(char* str, int* flag)

}int quary(char* longstr, int* flag)

}while(j<26)

j++;

}return 1;

}int main(void)

;char longstr = "abcdefghlmnopqrs";

char shortstr = "dcgsrqpom";

//char shortstr = "dcgsrqpoz";

note(shortstr, flag);

if (quary(longstr, flag))

else

return 0;

}字串是否包含問題的繼續補充

什麼是bit-map?

oliver:所謂的bit-map就是用乙個bit位來標記某個元素對應的value, 而key即是該元素。由於採用了bit為單位來儲存資料,因此在儲存空間方面,可以大大節省。

如果看了以上說的還沒明白什麼是bit-map,那麼我們來看乙個具體的例子,假設我們要對0-7內的5個元素(4,7,2,5,3)排序(這裡假設這些元素沒有重複)。那麼我們就可以採用bit-map的方法來達到排序的目的。要表示8個數,我們就只需要8個bit(1bytes),首先我們開闢1byte的空間,將這些空間的所有bit位都置為0,如下圖:

然後遍歷這5個元素,首先第乙個元素是4,那麼就把4對應的位置為1(可以這樣操作:p+(i/8)|(0x01<

當然了這裡的操作涉及到big-ending和little-ending的情況,這裡預設為big-ending),因為是從零開始的,所以要把第五位置為一(如下圖):

接著再處理第二個元素7,將第八位置為1,,接著再處理第三個元素,一直到最後處理完所有的元素,將相應的位置為1,這時候的記憶體的bit位的狀態如下:

最後我們現在遍歷一遍bit區域,將該位是一的位的編號輸出(2,3,4,5,7),這樣就達到了排序的目的。

**示例

//點陣圖的乙個示例

////july、updated,2011.04.25.

#include 

#include 

//定義每個byte中有8個bit位

#define bytesize 8 

void

setbit(

char

*p, 

intposi)  

*p = *p|(0x01<

return

;  }    

void

bitmapsortdemo()   

;    

//bufferlen這個值是根據待排序的資料中最大值確定的  

//待排序中的最大值是14,因此只需要2個bytes(16個bit)    

//就可以了。    

const

intbufferlen = 2;      

char

*pbuffer = 

newchar

[bufferlen];   

//要將所有的bit位置為0,否則結果不可預知。    

memset(pbuffer,0,bufferlen);      

for(

inti=0;i<9;i++)      

//輸出排序結果     

for(i=0;i//每次處理乙個位元組(byte)    

}    

pbuffer++;     

}  printf("/n"

);  

}     

intmain()   

位圖總結

:1、可進行資料的快速查詢,判重,刪除,一般來說資料範圍是int的10倍以下

2、使用bit陣列來表示某些元素是否存在,比如8位**號碼

讀程式設計師程式設計藝術第二章 字串包含問題

字串包含問題 即乙個字串是否包含另乙個字串。這個問題雖然比較簡單,但是想要優化輪詢的時間複雜度卻不是那麼的簡單。最常見的方法就是針對乙個字串的字元,一一與另乙個字串中的字元相比較,看他們是否都在其中。即方法一 o n m 的輪詢方法,由於這種方法比較簡單,我就不貼了。方法二 基於o mlogm o ...

《程式設計師的自我修養》第二章學習筆記

第二章 編譯和鏈結 2.1被隱藏了的過程 我們知道,乙個程式由源 到可執行檔案往往由這幾步構成 預處理 prepressing 編譯 compilation 彙編 assembly 鏈結 linking 如圖所示,2.1.1預編譯 includeint main void 如上述檔案hello.c,...

程式設計師的自我修養學習筆記 第二章

從原始檔到可以行檔案的過程 預處理 編譯 彙編 鏈結 第一步預編譯 gcc e hello.c o hello.i 或者 cpp hello.c hello.i 注 e 選項表示只進行預編譯 cpp是預編譯器 預編譯主要處理一 開頭的預編譯指令 將所有的 define 刪除,並且展開所有的巨集定義 ...