字符串知識(shí)點(diǎn)

·?二進(jìn)制補(bǔ)碼基礎(chǔ)

補(bǔ)碼用于在計(jì)算機(jī)內(nèi)表示負(fù)數(shù), 負(fù)數(shù) 2的補(bǔ)碼表示法可以將加法運(yùn)算規(guī)則, 擴(kuò)展到整個(gè)整數(shù)集。

· 機(jī)器數(shù):帶符號(hào)的二進(jìn)制碼字 ,比如,十進(jìn)制中的數(shù) +3 ,計(jì)算機(jī)字長(zhǎng)為8位,轉(zhuǎn)換成二進(jìn)制就是0000 0011。如果是 -3 ,就是 1111 1101 。那么,這里的 00000011 和 1111 1101 就是機(jī)器數(shù)。 機(jī)器數(shù)包含了符號(hào)和數(shù)值部分。

·真值:帶符號(hào)位的機(jī)器數(shù)對(duì)應(yīng)的真正數(shù)值,比如 -3,+3

·在計(jì)算機(jī)內(nèi),有符號(hào)數(shù)有3種表示法:原碼、反碼和補(bǔ)碼。

? ???[+1] = [ 00000001 ]原碼 = [ 00000001 ]反碼 =?[ 00000001 ]補(bǔ)碼 ;?

? ? ?[-1]? = [ 10000001 ]原碼?= [ 11111110 ]反碼 = [11111111]補(bǔ)碼

????原碼第一位是符號(hào)位, 所以若是8位二進(jìn)制數(shù),其取值范圍就是: [1111 1111 , 0111 1111]? 即[-127 , 127]?

? ??反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。?

? ? 補(bǔ)碼:正數(shù)原碼一致,負(fù)數(shù)反碼加1,如-8= 0-8 ((11111111-00001000)反碼??+00000001)加1?=11111000?

C語(yǔ)言中變量以補(bǔ)碼形式存放在內(nèi)存中,正數(shù)的補(bǔ)碼與原碼相同,負(fù)數(shù)求補(bǔ)碼方式為(符號(hào)位不變,其余各位取反,最后末尾加1);

32位機(jī)器:int 32位,short 16位。

x = 127,正數(shù),原碼:0111 1111,補(bǔ)碼:0111 1111,擴(kuò)展到32位高位補(bǔ)0,結(jié)果為0000007FH;?

Y = -9,? 負(fù)數(shù),原碼:1000 1001,補(bǔ)碼:1111 0111,擴(kuò)展到16位高位補(bǔ)1,結(jié)果為FFF7H;

z = x + y = 118,原碼:0111 0110,補(bǔ)碼:0111 0110,擴(kuò)展到32位高位補(bǔ)0,結(jié)果為00000076H。? 注意:擴(kuò)展時(shí),符號(hào)位不變。

·?哈夫曼編碼

在處理字符串序列時(shí),如果對(duì)每個(gè)字符串采用相同的二進(jìn)制位表示,則稱這種編碼方式為定長(zhǎng)編碼。若允許對(duì)不同的字符采用不等長(zhǎng)的二進(jìn)制位進(jìn)行表示,那么這種方式稱為可變長(zhǎng)編碼??勺冮L(zhǎng)編碼其特點(diǎn)是對(duì)使用頻率高的字符采用短編碼,而對(duì)使用頻率低的字符則采用長(zhǎng)編碼的方式。這樣我們就可減少數(shù)據(jù)的存儲(chǔ)空間,從而起到壓縮數(shù)據(jù)的效果。而通過(guò)哈夫曼樹形成的哈夫曼編碼是一種有效的數(shù)據(jù)壓縮編碼。?

·?KMP算法及next數(shù)組求解

對(duì)于正常的字符串模式匹配,主串長(zhǎng)度為m,子串為n,時(shí)間復(fù)雜度會(huì)到達(dá)O(m*n),空間復(fù)雜度為O(1),而如果用KMP算法,復(fù)雜度將會(huì)減少線型時(shí)間O(m+n),由于涉及到next數(shù)組的存儲(chǔ),空間復(fù)雜度O(n)。

· next數(shù)組求解:以從1開始,next[1]=0,next[2]=1,next[n] :將前面n-1個(gè)字符,計(jì)算從首尾開始組成最大的相同子串的長(zhǎng)度,如果找到,那么next值是該長(zhǎng)度加1,否則next值是1。

· kmp及next數(shù)組實(shí)現(xiàn):代碼

· 錯(cuò)題總結(jié):

1、strlen:字符串長(zhǎng)度,不包含‘結(jié)束符\0’? ? ? ? 轉(zhuǎn)義字符:\\=\ ; \123=S; \t=Tab鍵; \0表示后面字符為八進(jìn)制,‘\09’為非法字符。

2、 廣義表L=(A,B,C),表頭是A,表尾是(B,C) 。tail()表示取字符串的尾部,head()表示取字符串的頭。

3、 printf("格式控制字符串", 輸出列表);printf("%s", string);? putchar(字符數(shù)據(jù))char? a_c=‘h’;putchar(a_c);puts(字符串); puts(“hello girl”)? ;

4、?結(jié)構(gòu)體內(nèi)存原則: 對(duì)齊原則:每一成員需對(duì)齊為后一成員類型的倍數(shù)// 補(bǔ)齊原則:最終大小補(bǔ)齊為成員類型最大值的倍數(shù)

5、 %s格式輸出直到'\0'的字符串,字符串尾數(shù)字0為‘\0’結(jié)束符,%c對(duì)應(yīng)的是單個(gè)字符,%d是十進(jìn)制整數(shù)型輸出。

6、65536?相當(dāng)于?unsigned?short??的0值。如 65537:1 00000000 00000001,(2字節(jié))short i = 65537時(shí),發(fā)生了溢出取16bit,為1。

7、單線程運(yùn)行效率: String<< StringBuffer( 線程安全 )< StringBuilder( 非線程安全 )?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容