誤中陣列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 刪除,並且展開所有的巨集定義 ...