IV杂记

作者: Cheetahlou | 来源:发表于2017-07-28 21:49 被阅读5次

    答案也是借鉴大神的!只是拿来和大家分享!!! (从-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]的值: (字符串匹配是 从头开始的 和 从尾开始的字符串进行匹配是否重复 )

    next[i]的值主要是看s[i]之前的字符串中重复的子串长度。next[0] = -1,定值。

    next[1]是看s[1]之前的字符串“a”中重复的子串长度为0,故next[1] = 0。

    next[2]是看s[2]之前的字符串“ab”中重复的子串长度为0,故next[2] = 0。

    next[3]是看s[3]之前的字符串"aba"中重复的子串长度,s[0]与s[2]重复,长度为1,故next[3] = 1。

    next[4]是看s[4]之前的字符串"abab"中重复的子串长度,s[01]与s[23]重复,长度为2,故next[4] = 2。

    next[5]是看s[5]之前的字符串"ababa"中重复的子串长度,s[012]与s[234]重复,长度为3,故next[5] = 3。

    next[6]是看s[6]之前的字符串"ababaa"中重复的子串长度,s[0]与s[5]重复(因为多了一个a,无法找到长度为3的重复字符串,这只能是s[0]和s[5]重复),长度为1,故next[6] = 1。

    同样的,求next[7]和next[8]、next[9]、 next[10]、 next[11] 分别为1和2、3、4、5。


    next数组下标从1开始计算

    next[1] 肯定是 0

    next[2] 肯定是 1

    next[n] 的情况,将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。

    举例

    next[6]的计算,字符串第六位是 a ,( ababa a ababaa)

    将前面的5个字符,从头尾开始取4个组成子串比较,如果不相等,则从首尾取3个字符组成子串继续比较,并以此类推, 如果一直比较到最后一个字符都不相等,那么该next值为1。

    4个字符的情况:abab : baba

    3个字符的情况:aba : aba 此时相等,那么next[6] = 3+1 = 4


    public void add(int a) { int b = a; } 这个可以看作是值传递,a是基本数据类型,他把他的值传给了b public void add(Object obj) { Object objTest = obj; } 这个可以看作是址传递,obj是引用数据类型,是把他栈中指向堆中的对象的地址值赋值给了objTest. 这时候就同时有两个引用指向了堆中的某个Object对象 其实这样看来,java应该只有值传递的。如果是基本数据类型,传递的就是实际的值. 如果是引用数据类型,传递的就是该引用的地址值.


    • 从输入网址到显示网页,过程 ?

    DNS域名解析 –> 发起TCP的三次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如JavaScript、css、图片等) –> 浏览器对页面进行渲染呈现给用户。


    TCP的状态 (SYN, FIN, ACK, PSH, RST, URG) 在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG. 其中,对于我们日常的分析有用的就是前面的五个字段。 它们的含义是: SYN表示建立连接, FIN表示关闭连接, ACK表示响应, PSH表示有 DATA数据传输, RST表示连接重置。 其中,ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应, 如果只是单个的一个SYN,它表示的只是建立连接。 TCP的几次握手就是通过这样的ACK表现出来的。 但SYN与FIN是不会同时为1的,因为前者表示的是建立连接,而后者表示的是断开连接。 RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。 一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。 PSH为1的情况,一般只出现在 DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。 TCP的连接建立和连接关闭,都是通过请求-响应的模式完成的。 概念补充-TCP三次握手: TCP(Transmission Control Protocol)传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码) 第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机; 第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包; 第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。 完成三次握手,主机A与主机B开始传送数据。 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据. 摘自中国云安网(www.yunsec.net) 原文:http://www.yunsec.net/a/school/wlcs/agreement/2012/0317/10262.html


    一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成

    1.请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。
    2.请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息。
    3.最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
    4.请求数据不在GET方法中使用,而是在POST方法中使用。

    HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。


    • redis安装和使用
      下载地址官网 https://redis.io/download
      安装准备:(1)VMware Workation虚拟机(2)Linux(CentOS)系统(3)SecureCRT(Xshell也行)
      安装过程:
      (1)安装编译器:yum install gcc-c++(需要先安装C++编译器,redis 使用c++写的)
      (2)下载Redis源码并上传到服务器
      (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

    相关文章

      网友评论

          本文标题:IV杂记

          本文链接:https://www.haomeiwen.com/subject/mloflxtx.html