答案也是借鑒大神的璃诀!只是拿來和大家分享;】伞!劣欢! (從-1開始算起)
i 0 1 2 3 4 5 6 7 8 9 10 11
s a b a b a a a b a b a a
next[i] -1 0 0 1 2 3 1 1 2 3 4 5
先計算前綴next[i]的值: (字符串匹配是 從頭開始的 和 從尾開始的字符串進行匹配是否重復(fù) )
next[i]的值主要是看s[i]之前的字符串中重復(fù)的子串長度棕诵。next[0] = -1,定值氧秘。
next[1]是看s[1]之前的字符串“a”中重復(fù)的子串長度為0年鸳,故next[1] = 0。
next[2]是看s[2]之前的字符串“ab”中重復(fù)的子串長度為0丸相,故next[2] = 0搔确。
next[3]是看s[3]之前的字符串"aba"中重復(fù)的子串長度,s[0]與s[2]重復(fù)灭忠,長度為1膳算,故next[3] = 1。
next[4]是看s[4]之前的字符串"abab"中重復(fù)的子串長度弛作,s[01]與s[23]重復(fù)涕蜂,長度為2,故next[4] = 2映琳。
next[5]是看s[5]之前的字符串"ababa"中重復(fù)的子串長度机隙,s[012]與s[234]重復(fù)蜘拉,長度為3,故next[5] = 3有鹿。
next[6]是看s[6]之前的字符串"ababaa"中重復(fù)的子串長度旭旭,s[0]與s[5]重復(fù)(因為多了一個a,無法找到長度為3的重復(fù)字符串葱跋,這只能是s[0]和s[5]重復(fù))持寄,長度為1,故next[6] = 1娱俺。
同樣的稍味,求next[7]和next[8]、next[9]荠卷、 next[10]模庐、 next[11] 分別為1和2、3僵朗、4赖欣、5。
next數(shù)組下標(biāo)從1開始計算
next[1] 肯定是 0
next[2] 肯定是 1
next[n] 的情況验庙,將前面n-1個字符,計算從首尾開始組成最大的相同子串的長度社牲,如果找到粪薛,那么next值是該長度加1,否則next值是1搏恤。
舉例
next[6]的計算违寿,字符串第六位是 a ,( ababa a ababaa)
將前面的5個字符熟空,從頭尾開始取4個組成子串比較藤巢,如果不相等,則從首尾取3個字符組成子串繼續(xù)比較息罗,并以此類推掂咒, 如果一直比較到最后一個字符都不相等,那么該next值為1迈喉。
4個字符的情況:abab : baba
3個字符的情況:aba : aba 此時相等绍刮,那么next[6] = 3+1 = 4
public void add(int a) { int b = a; } 這個可以看作是值傳遞,a是基本數(shù)據(jù)類型挨摸,他把他的值傳給了b public void add(Object obj) { Object objTest = obj; } 這個可以看作是址傳遞孩革,obj是引用數(shù)據(jù)類型,是把他棧中指向堆中的對象的地址值賦值給了objTest. 這時候就同時有兩個引用指向了堆中的某個Object對象 其實這樣看來得运,java應(yīng)該只有值傳遞的膝蜈。如果是基本數(shù)據(jù)類型锅移,傳遞的就是實際的值. 如果是引用數(shù)據(jù)類型,傳遞的就是該引用的地址值.
- 從輸入網(wǎng)址到顯示網(wǎng)頁饱搏,過程 帆啃?
DNS域名解析 –> 發(fā)起TCP的三次握手 –> 建立TCP連接后發(fā)起http請求 –> 服務(wù)器響應(yīng)http請求,瀏覽器得到html代碼 –> 瀏覽器解析html代碼窍帝,并請求html代碼中的資源(如JavaScript努潘、css、圖片等) –> 瀏覽器對頁面進行渲染呈現(xiàn)給用戶坤学。
TCP的狀態(tài) (SYN, FIN, ACK, PSH, RST, URG) 在TCP層疯坤,有個FLAGS字段,這個字段有以下幾個標(biāo)識:SYN, FIN, ACK, PSH, RST, URG. 其中深浮,對于我們?nèi)粘5姆治鲇杏玫木褪乔懊娴奈鍌€字段压怠。 它們的含義是: SYN表示建立連接, FIN表示關(guān)閉連接飞苇, ACK表示響應(yīng)菌瘫, PSH表示有 DATA數(shù)據(jù)傳輸, RST表示連接重置布卡。 其中雨让,ACK是可能與SYN,F(xiàn)IN等同時使用的忿等,比如SYN和ACK可能同時為1栖忠,它表示的就是建立連接之后的響應(yīng), 如果只是單個的一個SYN贸街,它表示的只是建立連接庵寞。 TCP的幾次握手就是通過這樣的ACK表現(xiàn)出來的。 但SYN與FIN是不會同時為1的薛匪,因為前者表示的是建立連接捐川,而后者表示的是斷開連接。 RST一般是在FIN之后才會出現(xiàn)為1的情況逸尖,表示的是連接重置古沥。 一般地,當(dāng)出現(xiàn)FIN包或RST包時冷溶,我們便認(rèn)為客戶端與服務(wù)器端斷開了連接渐白;而當(dāng)出現(xiàn)SYN和SYN+ACK包時,我們認(rèn)為客戶端與服務(wù)器建立了一個連接逞频。 PSH為1的情況纯衍,一般只出現(xiàn)在 DATA內(nèi)容不為0的包中,也就是說PSH為1表示的是有真正的TCP數(shù)據(jù)包內(nèi)容被傳遞苗胀。 TCP的連接建立和連接關(guān)閉襟诸,都是通過請求-響應(yīng)的模式完成的瓦堵。 概念補充-TCP三次握手: TCP(Transmission Control Protocol)傳輸控制協(xié)議 TCP是主機對主機層的傳輸控制協(xié)議,提供可靠的連接服務(wù)歌亲,采用三次握手確認(rèn)建立一個連接: 位碼即tcp標(biāo)志位菇用,有6種標(biāo)示:SYN(synchronous建立聯(lián)機) ACK(acknowledgement 確認(rèn)) PSH(push傳送) FIN(finish結(jié)束) RST(reset重置) URG(urgent緊急)Sequence number(順序號碼) Acknowledge number(確認(rèn)號碼) 第一次握手:主機A發(fā)送位碼為syn=1,隨機產(chǎn)生seq number=1234567的數(shù)據(jù)包到服務(wù)器陷揪,主機B由SYN=1知道惋鸥,A要求建立聯(lián)機; 第二次握手:主機B收到請求后要確認(rèn)聯(lián)機信息悍缠,向A發(fā)送ack number=(主機A的seq+1)卦绣,syn=1,ack=1飞蚓,隨機產(chǎn)生seq=7654321的包滤港; 第三次握手:主機A收到后檢查ack number是否正確,即第一次發(fā)送的seq number+1趴拧,以及位碼ack是否為1溅漾,若正確,主機A會再發(fā)送ack number=(主機B的seq+1)著榴,ack=1添履,主機B收到后確認(rèn)seq值與ack=1則連接建立成功。 完成三次握手兄渺,主機A與主機B開始傳送數(shù)據(jù)缝龄。 在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù)挂谍,采用三次握手建立一個連接。 第一次握手:建立連接時瞎饲,客戶端發(fā)送syn包(syn=j)到服務(wù)器口叙,并進入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn)嗅战; 第二次握手:服務(wù)器收到syn包妄田,必須確認(rèn)客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k)驮捍,即SYN+ACK包疟呐,此時服務(wù)器進入SYN_RECV狀態(tài); 第三次握手:客戶端收到服務(wù)器的SYN+ACK包东且,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1)启具,此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED狀態(tài)珊泳,完成三次握手鲁冯。完成三次握手拷沸,客戶端與服務(wù)器開始傳送數(shù)據(jù). 摘自中國云安網(wǎng)(www.yunsec.net) 原文:http://www.yunsec.net/a/school/wlcs/agreement/2012/0317/10262.html
一個HTTP請求報文由請求行(request line)、請求頭部(header)薯演、空行和請求數(shù)據(jù)4個部分組成
1.請求行由請求方法字段撞芍、URL字段和HTTP協(xié)議版本字段3個字段組成,它們用空格分隔跨扮。
2.請求頭部由關(guān)鍵字/值對組成序无,每行一對,關(guān)鍵字和值用英文冒號“:”分隔衡创。請求頭部通知服務(wù)器有關(guān)于客戶端請求的信息帝嗡。
3.最后一個請求頭之后是一個空行,發(fā)送回車符和換行符钧汹,通知服務(wù)器以下不再有請求頭丈探。
4.請求數(shù)據(jù)不在GET方法中使用,而是在POST方法中使用拔莱。
HTTP響應(yīng)也由三個部分組成碗降,分別是:狀態(tài)行、消息報頭塘秦、響應(yīng)正文讼渊。
-
redis安裝和使用
下載地址官網(wǎng) https://redis.io/download
安裝準(zhǔn)備:(1)VMware Workation虛擬機(2)Linux(CentOS)系統(tǒng)(3)SecureCRT(Xshell也行)
安裝過程:
(1)安裝編譯器:yum install gcc-c++(需要先安裝C++編譯器,redis 使用c++寫的)
(2)下載Redis源碼并上傳到服務(wù)器
(3)解壓Redis壓縮包:tar -zxvf redis
(4)進入Redis目錄進行編譯:make
(2/3/4步)或者直接在Linux上($符不用輸入)
$ wget http://download.redis.io/releases/redis-3.2.9.tar.gz(下載)
$ tar xzf redis-3.2.9.tar.gz(解壓)
$ cd redis-3.2.9
$ make(編譯)
編譯后是二進制文件僅在目錄中 src 可用尊剔。運行Redis:
要想更好的使用還需
(5)安裝Redis:make PREFIX=/user/local/redis install
(6)將redis.conf拷貝到Redis安裝目錄:cp redis.conf /user/local/redis
(7)進入安裝目錄爪幻,更改redis.conf文件:vim redis.conf --> daemonize no 改為 yes(之后可以后臺模式運行)(vi 下按i 進行編輯 按esc后shift+zz(或者直接l倆大寫Z),或者:wq 保存并退出)
(8)啟動redis后端模式:./bin/redis-server ./redis.conf
(9)終止redis的操作 : ./bin/redis-cli shutdown