例如:輸入「天」即可將所有姓名中帶有「天」字的人搜尋出來;輸入「0809」即可將所有id中帶有「0809」片段的人搜尋出來。
這種搜尋程式設計客棧技術被廣泛應用於各大有查詢功能的軟體,為使用者提供了極大的方便。在眾多的qq/微信好友中,輸入想要查詢的聯絡人的姓名的一部分即可查詢到該聯絡人,是不是很方便呢?在excel中,即使只記住了查詢物件的幾個字,也能夠通過這種查詢方式查詢到對應的物件,是不是彌補了你的健忘症呢?
實現模糊搜尋演算法的思路:輸入的關鍵詞即為乙個字元陣列(字串),本文將以"abcdef"這個字串為例。要想完成對片段的查詢,不能僅僅從前往後比對,也不能僅僅從後往前比對,而是要將所有的片段都進行一遍比對。這就要求要將字串的所有連續子片段都找出來存放到乙個新的線性結構中,通過對新線性結構的遍歷並使用字串比較函式strcmp進行模糊搜尋。
那麼"abcdef"這個字串到底有多少個連續子片段呢?我們按照子片段的長度挨個找規律,按長度由大到小進行:長度為6的就只有"abcdef"這1個;長度為5的有2個:"abcde"和"bcdef";長度為4的有3個:"abcd"、"bcde"和"cdef";長度為3的有4個;長度為2的有5個;長度為1的有6個。所以一共有1+2+3+4+5+6=21個。想必看到這裡大家已經找到了規律:若關鍵詞的長度為程式設計客棧n,則該關鍵詞的連續子字串的個數就為1+2+3+...+n。
以下函式用作判斷是否符合篩選條件,其中key為關鍵詞。
//模糊搜尋判斷是否符合篩選條件
int result_mohu(const gchar* key,char* str)
element;
int i,j,k=0,l=0,m=0;
//f=1為符合篩選條件
int f=0;
//n1為str的長度 n2為str連續子串的個數
int n1=0,n2=0;
n1=strlen(str);
/*計算連續子串的個數*/
for(i=1;i<=n1;i++)
n2+=i;
/*計算連續子串的個數*/
//i控制子字串的長度
//j控制賦值
//k控制新的線性結構b的下標
//l控制子陣列的首項在原陣列中的位置
//m控制即將用作賦值的str的下標
element *b=malloc(sizeof(element)*n2);
for(i=1;i<=n1;i++)
l++;
k++;
if(m==n1)
break;
}} //挨個比對
for(i=0;i
若返回值f=1則表示符合篩選條件,即查詢物件含有包含關鍵詞的片段。最為關鍵的迴圈就是按照子字串的長度從1到n1(查詢物件字串的長度)。
以下片段為遍歷**,可看可不看,核心演算法都在上面。注:博主實現模糊搜尋的環境是linux系統下的gtk開發。
//按學號查詢介面的查詢》
void on_butt程式設計客棧on_idsearch_clicked(gtkobject* widget,gpointer user_data)
{ int i;
int f=0;
gtktreeiter iter;
//獲取搜尋關鍵字
const gchar* keywords = gtk_entry_get_text(entry_search_id);
gtk_list_store_clear(liststore2);
for(i=0;i
最後給大家看一下實驗結果:
總結本文標題: 使用c語言實現模糊搜尋功能
本文位址:
實現模糊搜尋功能
如果搜尋內容存在就出現類似上面的,相應內容顯示在下面 如果沒有匹配的內容無變化 html 所屬醫院 css searchdatajs function choose hospital id,name function searchlist param success function res sea...
C語言實現Linux cd功能
查了一下,關於cd命令網上有各種複雜的實現方式。其實要求不嚴格的話,呼叫chdir 即可實現。cd方法簡單實現 void cd char path int chdir const char path 說明 chdir函式用於改變當前工作目錄。呼叫引數是指向目錄的指標,呼叫程序需要有搜尋整個目錄的許可...
iOS 實現模糊搜尋的功能
模糊搜尋的實現思路是當搜尋框開始編輯時對搜尋框中的文字與後台給的資源相對比,包含搜尋文字的展示在tableview中.關鍵部分 如下 void searchbar uisearchbar searchbar textdidchange nsstrin程式設計客棧g searchtext self.t...