KMP.H
#ifndef KMP_H_H #define OK 0 #define ERROR -1 #define MAX_LENGTH 255 typedef unsigned char SString[MAX_LENGTH + 1]; //第0個位置存放串的長度 int sstr_assign(SString, const char*); int sstr_print(SString); int print_nextval(SString, int*, int); void get_nextval(SString, int*); int get_next(SString, int*); int index_KMP(SString, SString, int, int*); #endif
KMP.CPP
#include<stdio.h> #include<stdlib.h> #include"KMP.h" //產生一個SString類型的串,其值等於sstr int sstr_assign(SString T, const char *sstr) { int ix = 0; while(sstr[ix] != '/0') { T[ix + 1] = sstr[ix++]; //如果空間耗盡,則不再複製。 if(ix == MAX_LENGTH) break; } //保存串的長度 T[0] = ix; return OK; } int sstr_print(SString T) { int cnt = T[0]; int ix = 1; while(cnt-- > 0) { printf("%c",T[ix++]); } printf("/n"); return OK; } void get_nextval(SString T, int *nextval) { int i = 1; int j = 0; nextval[1] = 0; while(i < T[0]) { if(0 == j || T[i] == T[j]) { i++; j++; if(T[i] != T[j]) { nextval[i] = j; } else nextval[i] = nextval[j]; } else j = nextval[j]; } } int get_next(SString T, int *next) { int i = 1; int j = 0; next[1] = 0; while(i < T[0]) { if(0 == j || T[i] == T[j]) { i++; j++; next[i] = j; } else j = next[j]; } return OK; } int index_KMP(SString T, SString S, int pos, int *next) { if(pos < 1 || pos > T[0] || 0 == T[0] || 0 == S[0]) return ERROR; int ix = pos; int jx = 1; while(ix <= T[0] && jx <= S[0]) { if(jx == 0 || T[ix] == S[jx]) { ix++; jx++; } else jx = next[jx]; } if(jx > S[0]) return ix - S[0]; return OK; } int print_nextval(SString T, int *nextval, int n) { for(int i = 1 ; i <= n ; i++) printf("%3d", i); printf("/n"); for(i = 1 ; i <= n ; i++) printf("%3c", T[i]); printf("/n"); for(i = 1 ; i <= n ; i++) printf("%3d", nextval[i]); printf("/n"); return OK; }
二叉平衡查找樹AVL詳解 看懂這篇文章所需的知識點 樹、二叉搜索樹、樹高、樹深、層等概念 AVL樹 概念:任意節點的左右子樹的高度差不能大於1的樹即爲AVL樹,是爲了解決在頻繁插入刪除等動態更新下出現的時間複雜度退化的問題,所以平
AVL樹旋轉原理和簡易實現 二叉搜索樹雖然可以提高搜索效率,但是如果插入的數據有序時很有可能變成單支,如果變成單支樹的時候,那麼查找時效率也不高了。因此引入AVL樹。 AVL樹是當向這棵樹插入節點的時候,要保證每個節點的左右子樹的
紅黑樹的旋轉原理和模擬實現 我們瞭解到AVL樹雖然效率很高,但是它是通過多次的旋轉纔到達一個絕對的平衡,旋轉的消耗其實也很大。因此開始引入近似平衡的一棵樹----紅黑樹(RBTree)。紅黑樹每一個節點不是紅色的就是黑色的,它保證
1.給定100億個整數,設計算法找到只出現一次的整數? ①方法一 100億個整數就是400億個字節,42億九千萬是4G,那麼1G就是10億字節,所以要存下100億個整數需要40G的內存空間。因此我們採用位圖100億個整數大概就是1
布隆過濾器 假如現在有40億個ip地址(string類型),然後給你一個ip地址,讓你查找這個ip地址在不在這40億個ip地址裏?我們應該怎麼做呢? 如果用哈希表來處理的話,這裏有40億的數據,數據量太大,因此太佔用空間 如果用
————————————————18.4.18更新有時我們會遇到這樣的問題:在一棵樹上,每次詢問兩點間路徑上的和或者是最值。但我們用搜索時,時間就會到O(n),這樣根本就完不成算法。但樹上剖分就可以縮短修改的時間。樹上剖分的算法簡介我們定
request作爲前後臺交換的橋樑,有重要作用。 request常用的方法有讀參數:public String getParameter(String paramName);讀取屬性public Object getAttribut
1.非空二叉樹的高度 1.1非遞歸算法實現求解非空二叉樹的高度 算法思想:採用層次遍歷的算法,設置變量level記錄當前結點所在的層數,設置變量last指向當前層的最右的結點,每次層次遍歷出隊的時候與last指針比較(fron
考研加油!!!!!!! 1.1樹的重要概念 1.樹是一種重要的非線性結構;在有n個結點的樹中有n-1條邊; 2.在結點個數爲n(n>1)的各棵樹中,深度最小的樹的深度是多少?它有多少葉子結點?多少分支結點?深度最大的樹的深度是多少?它有多
使用stringstream http://blog.csdn.net/xw20084898/article/details/21939811 stringstream 是 C++ 提供的另一個字串型的串流(stream)
1.什麼是線性結構 線性結構是一種有序數據項的集合,其中每個數據項都有唯一的前驅和後繼(除了第一個沒有前驅,最後一個沒有後繼)。新的數據項加入到數據集中時,只會加入到原有某個數據項之前或之後。具有這種性質的數據集,就稱爲線性結構。
一、Trie的介紹: 1、主要應用場景:搜索引擎的自動補全功能:Trie樹+詞頻(概率)權重因子 IP路由:最長前綴匹配,Trie路由算法
先總結有序數組,無序的後面再總結。。 1.以空間換時間法。 算法思想:目標數組array[length],是一個有序數組,比如int array[]={1,1,2,2,4,4,4,4,4,5,5,6,10};總共有13個元素,
數組求和 方法一:直接一次for循環 int GetSum1(int *a,int n) { int sum=0; for (int i=0; i<n;i++) { sum+=a[i];
題目描述 你有一個長爲N寬爲2的牆壁,給你兩種磚頭:一個長2寬1,另一個是L型覆蓋3個單元的磚頭。如下圖: 0 0 0 00 磚頭可以旋轉,兩種磚頭可以無限制提供。你的任務是計算用這兩種來覆蓋N*2的牆壁的覆蓋方法。例如一個2*3