精华内容
下载资源
问答
  • Cambridge.Next Generation Wireless LANs系列教材,包含Cambridge.Next Generation Wireless LANs.802.11n与Cambridge.Next Generation Wireless LANs.802.11n and 802.11ac.
  • 大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一些思考的...

    大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。在考研备考中,参考严奶奶的教材,我也是在关于求next值的算法中卡了一下午时间,感觉挺有意思的,把一些思考的结果整理出来,与大家一起探讨。

    本文的逻辑顺序为
    1、最基本的朴素算法
    2、优化的KMP算法
    3、应算法需要定义的next值
    4、手动写出较短串的next值的方法
    5、最难理解的、足足有5行的代码的求next值的算法
    所有铺垫为了最后的第5点,我觉得以这个逻辑下来,由果索因还是相对好理解的,下面写的很通俗,略显不专业…

    一、问题描述

    给定一个主串S及一个模式串P,判断模式串是否为主串的子串;若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0;如S=“abcd”,P=“bcd”,则返回2;S=“abcd”,P=“acb”,返回0。

    二、朴素算法

    最简单的方法及一次遍历S与P。以S=“abcabaaaabaaacac”,P="abaabcac"为例,一张动图模拟朴素算法:

    在这里插入图片描述
    这个算法简单,不多说,附上代码

    #include<stdio.h>
    int Index_1(char s[],int sLen,char p[],int pLen){//s为主串,sLen为主串元素个数,p为模式串,pLen为模式串的个数
        if(sLen<pLen)return 0;
        int i = 1,j = 1;
        while(i<=sLen && j<=pLen){
            if(s[i]==p[j]){i++;j++;}
            else{
                i = i-j+2;
                j = 1;
            }
        }
        if(j>pLen) return i-pLen;
        return 0;
    }
    void main(){
        char s[]={' ','a','b','c','a','b','a','a','a','a','b','a','a','b','c','a','c'};//从序号1开始存
        char p[]={' ','a','b','a','a','b','c','a','c'};
        int sLen = sizeof(s)/sizeof(char)-1;
        int pLen = sizeof(p)/sizeof(char)-1;
        printf("%d",Index_1(s,sLen,p,pLen));
    }
    

    三、改进的算法——KMP算法

    朴素算法理解简单,但两个串都有依次遍历,时间复杂度为O(n*m),效率不高。由此有了KMP算法。
    一般的,在一次匹配中,我们是不知道主串的内容的,而模式串是我们自己定义的。
    朴素算法中,P的第j位失配,默认的把P串后移一位。
    但在前一轮的比较中,我们已经知道了P的前(j-1)位与S中间对应的某(j-1)个元素已经匹配成功了。这就意味着,在一轮的尝试匹配中,我们get到了主串的部分内容,我们能否利用这些内容,让P多移几位(我认为这就是KMP算法最根本的东西),减少遍历的趟数呢?答案是肯定的。再看下面改进后的动图:
    在这里插入图片描述

    这个模拟过程即KMP算法,若没有看明白,继续往下看相应的解释,理解需要把P多移几位,然后回头再看一遍这个图就很明了了。

    相比朴素算法:
    朴素算法: 每次失配,S串的索引i定位的本次尝试匹配的第一个字符的后一个。P串的索引j定位到1;T(n)=O(n*m)
    KMP算法: 每次失配,S串的索引i不动,P串的索引j定位到某个数。T(n)=O(n+m),时间效率明显提高

    而这“定位到某个数”,这个数就是接下来引入的next值。(实际上也就是P往后移多少位,换一种说法罢了:从上图中也可以看出,失配时固定i不变,令S[i]与P[某个数]对齐,实际上是P右移几位的另一种表达,只有为什么这么表达,当然是因为程序好写。)

    开——始——划——重——点!(图对逻辑关系比较好理解,但i和j的关系对后面求next的算法好理解!)

    • 比如,Pj处失配,绿色的是Pj,则我们可以确定P1…Pj-1是与Si…Si+j-2相对应的位置一一相等的
      在这里插入图片描述

    • 假设P1…Pj-1中,P1…Pk-1与Pj-k+1…Pj-1是一一相等的,为了下面说的清楚,我们把这种关系叫做“首尾重合”
      在这里插入图片描述

    • 那么可以推出,P1…Pk-1与Si…Si+j-2
      在这里插入图片描述

    • 显然,接下来要做的就是把模式串右移了,移到哪里就不用多说了:
      在这里插入图片描述

    • 为了表示下一轮比较j定位的地方,我们将其定义为next[j],next[j]就是第j个元素前j-1个元素首尾重合部分个数加一,当然,为了能遍历完整,首尾重合部分的元素个数应取到最多,即next[j]应取尽量大的值,原因挺好理解的,可以想个例子模拟一下,会完美跳过正确结果。在上图中就是绿色元素的next值为蓝色元素的序号。也即,对于字符串P,next[8]=4。如此,再看一下上面的动图是不是清楚了不少。

    • 最后,如果我们知道了一个字符串的next值,那么KMP算法也就很好懂了。相比朴素算法,当发生失配时,i不变,j=next[j]就好啦!接下来就是怎么确定next值了。

    四、手动写出一个串的next值

    我们规定任何一个串,next[1]=0。(不用next[0],与串的所有对应),仍是一张动图搞定问题:
    在这里插入图片描述
    这个扫一眼就能依次写出,会了这个方法,应付个期末考试没问题了。

    通过把next值“看”出来,我们再来分析next值,这就很容易得到超级有名的公式了,这个式子对后面的算法理解很重要!所以先要看懂这个式子,如果上面的内容通下来了,这个应该很容易看懂了:
    在这里插入图片描述

    五、求next的算法

    终于到了最后了~短的串的next值我们可以“看”出来,但长的串就需要借助程序了,具体算法刚接触的时候确实不容易理解,但给我的体验,把上面的内容写完,现在感觉简简单单了…先附上程序再做解释,(终于到了传说中的整整5行代码让我整理了一下午)。

    int GetNext(char ch[],int cLen,int next[]){//cLen为串ch的长度
        next[1] = 0;
        int i = 1,j = 0;
        while(i<=cLen){
            if(j==0||ch[i]==ch[j]) next[++i] = ++j;
            else j = next[j];
        }
    }
    
    • 还是先由一般再推优化:
      直接求next[j+1](至于为什么是j+1,是为了和下面的对应)
      根据之前的分析,next[j+1]的值为pj+1的前j个元素的收尾重合的最大个数加一。即需要满足两个条件,把它的值一步步“检验”出来。一是“个数最多”的,因此要从可能的最大值开始验;二是“首尾重合”,因此要一一对应验是否相等。
      不难理解,next[j+1]的最大值为j,所有我们从next[j+1]=j开始“验证”。有以下优先判断顺序:
      if(P1…Pj-1 == P2…Pj) => next[j+1]=j
      else if(P1…Pj-2 == P3…Pj) =>next[j+1]=j-1
      else if(P1…Pj-3 == P4…Pj) =>next[j+1]=j-2



      else if(P1P2 == Pj-1Pj) => next[j+1]=3
      else if(P1 == Pj-1) => next[j+1]=2
      else if(P1 != Pj-1) => next[j+1]=1

      每次前去尾1个,后掐头1个,直至得到next[j+1]

    • 再进一步想,next值是一个“工具”,我们单独的求next[j+1]是完全没有意义的,就是说要求next就要把所有j的next求出来。所有一般的,我们都是已知前j个元素的next值,求next[j+1],以此递推下去,求完整的next数组
      但是,上面的思考过程还是最根本的。所以问题变为两个:知道前j个元素的next的情况下,
      ①next[j+1]的可能的最大值是多少(即从哪开始验证)
      ②某一步验证失败后,需要“前去尾几个,后掐头几个?”(即本次验证失败后,再验证哪个值)
      看一下的分析:

    1、next[j+1]的最大值为next[j]+1。
    因为:
    假设next[j]=k1,则可以说明P1…Pk1-1=Pj-k1+1…Pj-1,且这是前j个元素最大的首尾重合序列。
    如果Pk1=Pj,那么P1…Pk1-1PK=Pj-k1+1…Pj-1Pj,那么k+1这也是前j+1个元素的最大首尾重合序列,也即next[j+1]的值为k1+1
    2、如果Pk1≠Pj,那么next[j+1]可能的次大值为next[next[j]]+1,以此类推即可高效求出next[j+1]
    这里不好解释,直接看下面的流程分析及图解

    开——始——划——重——点!
    从头走一遍流程
    ①求next[j+1],设值为m
    已知next[j]=k1,则有P1…Pk1-1 = Pj-k1+1…Pj-1
    如果Pk1=Pj,则P1…Pk1-1PK = Pj-k1+1…Pj-1Pj,则next[j+1]=k1+1,否则
    已知next[k1]=k2,则有P1…Pk2-1 = Pk1-k2+1…Pk1-1
    ⑤第二第三步联合得到:
    P1…Pk2-1 = Pk1-k2+1…Pk1-1 = Pj-k1+1…Pk2-k1+j-1 = Pj-k2+1…Pj-1 即四段重合
    ⑥这时候,再判断如果Pk2=Pj,则P1…Pk2-1P~k2 = Pj-k2+1…Pj-1Pj,则next[j+1]=k2+1;否则再取next[k2]=k3…以此类推

    上面几步,耐心看下来,结合那个式子很容易看懂。最后,再加一个图的模拟帮助理解:
    1、要求next[k+1] 其中k+1=17
    在这里插入图片描述
    2、已知next[16]=8,则元素有以下关系:
    在这里插入图片描述
    3、如果P8=P16,则明显next[17]=8+1=9
    4、如果不相等,又若next[8]=4,则有以下关系

    在这里插入图片描述
    又加上2的条件知
    在这里插入图片描述
    主要是为了证明:
    在这里插入图片描述
    5、现在在判断,如果P16=P4则next[17]=4+1=5,否则,在继续递推
    6、若next[4]=2,则有以下关系
    在这里插入图片描述
    7、若P16=P2,则next[17]=2+1=3;否则继续取next[2]=1、next[1]=0;遇到0时还没出结果,则递推结束,此时next[17]=1。最后,再返回看那5行算法,应该很容易明白了!

    展开全文
  • 软件测试——构造 NextDate 问题的弱一般的等价类测试用例 问题 构造 NextDate 问题的弱一般的等价类测试用例。 NextDate 问题:NextDate() 是整型变量 month, day 和 year 的函数,输入 1812-2012 年期间的某一日...

    软件测试——构造 NextDate 问题的弱一般的等价类测试用例

    问题

    构造 NextDate 问题的弱一般的等价类测试用例。

    • NextDate 问题:NextDate() 是整型变量 month, day 和 year 的函数,输入 1812-2012 年期间的某一日期的 month, day 和 year 的值,输出这一天的下一天的日期的 month, day 和 year 值。

    概念

    弱一般等价类测试用例覆盖:针对单缺陷,只覆盖有效等价类

    解答

    三个变量的取值范围

    • C1: 1 ≤ month ≤ 12
    • C2: 1 ≤ day ≤ 31
    • C3: 1812 ≤ year ≤ 2012

    可以划分为以下等价类集合

    • M1 = {month: month has 30 days}
    • M2 = {month: month has 31 days except December}
    • M3 = {month: month is December}
    • M4 = {month: month is February}
    • D1 = {day: 1 ≤ day ≤ 27}
    • D2 = {day: day = 28}
    • D3 = {day: day = 29}
    • D4 = {day: day = 30}
    • D5 = {day: day = 31}
    • Y1 = {year: year is a leap year}
    • Y2 = {year: year is a common year}

    可划分为10个弱一般等价类(除去了无效的等价类),为其设计测试用例如下表格所示

    • R1 = {M1, {D1, D2, D3}, {Y1, Y2}}
    • R2 = {M1, D4, {Y1, Y2}}
    • R3 = {M2, {D1, D2, D3, D4}, {Y1, Y2}}
    • R4 = {M2, D5, {Y1, Y2}}
    • R5 = {M3, {D1, D2, D3, D4}, {Y1, Y2}}
    • R6 = {M3, D5, {Y1, Y2}}
    • R7 = {M4, D1, {Y1, Y2}}
    • R8 = {M4, D2, Y1}
    • R9 = {M4, D2, Y2}
    • R10 = {M4, D3, Y1}

    弱一般等价测试用例

    测试用例yearmonthday期待输出
    WN1200904252009/04/26
    WN2200904302009/05/01
    WN3200903252009/03/26
    WN420090372009/04/01
    WN5200912252009/12/26
    WN6200912312010/01/01
    WN7200902252009/02/26
    WN8200802282008/02/29
    WN9200902282009/03/01
    WN10200802292008/03/01
    展开全文
  • Ubuntu18.04上安装NextCloud

    千次阅读 2019-11-02 17:07:23
    什么是NextCloud NextCloud网页是https://nextcloud.com/。 官方介绍是这样:Nextcloud is the most deployed on-premises file share and collaboration platform. Access & collaborate across your devices...

    什么是NextCloud

    NextCloud网页是https://nextcloud.com/

    官方介绍是这样:Nextcloud is the most deployed on-premises file share and collaboration platform. Access & collaborate across your devices.

    版本信息

    Ubuntu版本18.04

    NextCloud版本17.0.0

    Nginx版本1.14.0

    nginx -v

    PHP版本7.2.19

    php -v

    MySQL版本5.7.27

    mysql --help | grep mysql

    安装步骤

    安装nginx

    sudo apt-get install -y nginx

    安装MySQL

    sudo apt-get install -y mysql-server

    安装PHP

    sudo apt-get install -y php7.0 php-zip php-dompdf php-xml php-mbstring php-curl php-mysql php-fpm

    下载NextCloud

    sudo wget https://download.nextcloud.com/server/releases/nextcloud-17.0.0.zip

    sudo unzip nextcloud-17.0.0.zip

    mv nextcloud /var/www

    chown -R www-data:www-data nextcloud

    配置

    创建nextcloud数据库

    mysql -u root -p
    mysql> create database nextcloud;
    mysql> show databases; # 查看是否创建成功
    mysql> create user 'cloudmanager'@'localhost' identified by '***';#为nextcloud创建管理账户
    mysql> grant all privileges on nextcloud.* to 'cloudmanager'@'localhost' identified by '***';
    mysql> flush privileges;#并为其赋予管理权限

    配置nginx服务器

    cd /etc/nginx/sites-available
    vi cloud

    cloud配置内容如下

    upstream php-handler {
        #server 127.0.0.1:9000;
        server  unix:/var/run/php/php7.2-fpm.sock; #使用sock加速磁盘访问 #注意我这里使用的是php7.2-fpm
    }
    ​
    #若使用https,取消下面这段注释
    #server {
    #    listen 80;
    #    server_name cloud.example.com; #将cloud.example.com替换为你的域名
    #    # enforce https
    #    return 301 https://$server_name$request_uri;
    #}
    ​
    server {
        #listen 443 ssl http2; #若使用https,取消本行注释,同时注释下面这行
        listen 8090; 
        server_name cloud.example.com; #将cloud.example.com替换为你的域名
    ​
        #若使用https,取消注释下面两行
        #ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
        #ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;
    ​
        # Add headers to serve security related headers
        # Before enabling Strict-Transport-Security headers please read into this
        # topic first.
        # add_header Strict-Transport-Security "max-age=15768000;
        # includeSubDomains; preload;";
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;
    ​
        # Path to the root of your installation
        root /var/www/nextcloud/;
    ​
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
    ​
        # The following 2 rules are only needed for the user_webfinger app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
        #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json
        # last;
    ​
        location = /.well-known/carddav {
        return 301 $scheme://$host/remote.php/dav;
        }
        location = /.well-known/caldav {
        return 301 $scheme://$host/remote.php/dav;
        }
    ​
        # set max upload size
        client_max_body_size 512M;
        fastcgi_buffers 64 4K;
    ​
        # Enable gzip but do not remove ETag headers
        gzip on;
        gzip_vary on;
        gzip_comp_level 4;
        gzip_min_length 256;
        gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
        gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    ​
        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;
    ​
        location / {
            rewrite ^ /index.php$uri;
        }
    ​
        location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ {
            deny all;
        }
        location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
            deny all;
        }
    ​
        location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) {
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            # fastcgi_param HTTPS on; # 若使用https取消这行注释
            #Avoid sending the security headers twice
            fastcgi_param modHeadersAvailable true;
            fastcgi_param front_controller_active true;
            fastcgi_pass php-handler;
            fastcgi_intercept_errors on;
            fastcgi_request_buffering off;
        }
    ​
        location ~ ^/(?:updater|ocs-provider)(?:$|/) {
            try_files $uri/ =404;
            index index.php;
        }
    ​
        # Adding the cache control header for js and css files
        # Make sure it is BELOW the PHP block
        location ~ \.(?:css|js|woff|svg|gif)$ {
            try_files $uri /index.php$uri$is_args$args;
            add_header Cache-Control "public, max-age=15778463";
            # Add headers to serve security related headers (It is intended to
            # have those duplicated to the ones above)
            # Before enabling Strict-Transport-Security headers please read into
            # this topic first.
            # add_header Strict-Transport-Security "max-age=15768000;
            #  includeSubDomains; preload;";
            #
            # WARNING: Only add the preload option once you read about
            # the consequences in https://hstspreload.org/. This option
            # will add the domain to a hardcoded list that is shipped
            # in all major browsers and getting removed from this list
            # could take several months.
            add_header X-Content-Type-Options nosniff;
            add_header X-XSS-Protection "1; mode=block";
            add_header X-Robots-Tag none;
            add_header X-Download-Options noopen;
            add_header X-Permitted-Cross-Domain-Policies none;
            # Optional: Don't log access to assets
            access_log off;
        }
    ​
        location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ {
            try_files $uri /index.php$uri$is_args$args;
            # Optional: Don't log access to other assets
            access_log off;
        }
    }

    创建cloud文件软链接

    sudo ln -s /etc/nginx/sites-available/cloud /etc/nginx/sites-enabled/cloud

    测试配置脚本是否正常

    sudo nginx -t

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

    启动相关服务

    启动MySQL

    sudo /etc/init.d/php7.2-fpm restart

    [ ok ] Restarting php7.2-fpm (via systemctl): php7.2-fpm.service.

    启动nginx

    sudo /etc/init.d/nginx restart

    [ ok ] Restarting nginx (via systemctl): nginx.service.

    查看nginx状态

    ps -ef | grep nginx

    root 8705 1 0 13:30 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; www-data 8707 8705 0 13:30 ? 00:00:00 nginx: worker process www-data 8709 8705 0 13:30 ? 00:00:00 nginx: worker process www-data 8711 8705 0 13:30 ? 00:00:00 nginx: worker process www-data 8713 8705 0 13:30 ? 00:00:00 nginx: worker process root 8842 28878 0 13:30 pts/0 00:00:00 grep --color=auto nginx

    查看使用的端口

    netstat -tnlp | grep 8090

    tcp 0 0 0.0.0.0:8090 0.0.0.0:* LISTEN 8705/nginx: master

    配置NextCloud服务器

    主要是注册admin。在浏览器中输入IP地址访问。http://127.0.0.1:8090,如果成功安装了,就可以看到nextcloud的界面。

    展开全文
  • next数组两种求法

    万次阅读 多人点赞 2018-08-22 15:03:37
    (1)看到网上同一个字符串求 next 数组的值有两种,一种是 -1 开头,一种是 0 开头,虽然有差别,但是以 0 开头的next数组的每一项都比以 -1 开头的next数组的对应项大1,所以,具体是以 0 开头还是以 -1 开头看...

    一、说明 
    (1)看到网上同一个字符串求 next 数组的值有两种,一种是 -1 开头,一种是 0 开头,虽然有差别,但是以 0 开头的next数组的每一项都比以 -1 开头的next数组的对应项大1,所以,具体是以 0 开头还是以 -1 开头看需要吧,算法都是一样的.KMP 的原始论文 (K,M,P 三个家伙写的原文)中是以 0 开头的,所以下面的写法是以 0 开头的. 
    (2)关于 next 数组的求法,网上能找到很多流行简洁的写法,也有很多文章对简洁代码讲解得非常细致,然而本文并不是对流行算法的剖析,而只是记录一下自己比较喜欢的计算方法,并用代码实现一下.

    二、求法的文字描述

    (1)第一种求法:根据前一个字符的next值求字符串记作 p;next 数组记作 next;

    约定:

    • 下标从 1 开始算注意,不是从 0 开始算
    • 字符串长度 >2

    1)第一个字母的 next 值置 0 (next[1] = 0),第二个字母的 next 值置 1(next[2] = 1) ; 
    2)从第 3 个开始,计算第 i 个位置的 next 值时,检查

    p[i-1]== p[next[i-1]] ?(即这两个值是否相等)

    解释:第 i 个位置的前一个位置的值(即 p[i-1],记作 m)与以 m 的 next 值(即 next[i-1])为下标的值(即 p[next[i-1]],记作 n)是否相等,(看的懵懵的也没关系,后面会有例子)

    • 若相等,则 next[i] = next[i-1] + 1
    • 若不等,则继续往回找,检查

      p[i-1]== p[next[next[i-1]]] ?

      • 若相等,则 next[i] = next[next[i-1]] + 1
      • 若不等,则继续往回找,直到找到下标为 1 还不等(即字符串第一个元素),直接赋值 next[i] = 1

    (2)第二种求法:根据最大公共元素长度求 
    首先附上讲解的博文地址,里面有详细讲解 
    http://blog.csdn.net/v_july_v/article/details/7041827

    1)算出每一个字母前缀后缀的最大公共元素长度 
    2)最大公共元素长度整体向后移动一个长度,最前面的元素值填 -1,即为 next 数组的第一版本 
    3)(如果你需要的 next 数组第一个值为 -1,这步就可以省略了)next 数组的每一个值分别+1,即求得 next 数组。

    三、实例

    字符串 P =“ababaaababaa”

    求解: 
    (1)对应上面第一种求法 
    1)初始化

    Pababaaababaa
    下标123456789101112
    next01          

    2)求下标为 3 的字符的 next 值 
    P[3-1] = P[2] = ‘b’; 
    next[3-1] = next[2] = 1 ; 
    P[next[3-1]] = P[1] = ‘a’; 
    P[3-1] != P[next[3-1]] ,但是此时已经回溯到了第一个元素, 
    ∴ 直接P[3] = 1 ;

    Pababaaababaa
    下标123456789101112
    next011         

    3)求下标为 4 的字符的 next 值 
    P[4-1] = P[3] = ‘a’; 
    next[4-1] = next[3] = 1 ; 
    P[next[4-1]] = P[1] = ‘a’; 
    P[4-1] == P[next[4-1]] ; 
    ∴ next[4] = next[4-1] + 1 = 2 ;

    Pababaaababaa
    下标123456789101112
    next0112        

    4)求下标为 5 的字符的 next 值 
    P[5-1] = P[4] = ‘b’; 
    next[5-1] = next[4] = 2 ; 
    P[next[5-1]] = P[2] = ‘b’; 
    P[5-1] == P[next[5-1]] ; 
    ∴ next[5] = next[5-1] + 1 = 3 ;

    Pababaaababaa
    下标123456789101112
    next01123       

    5)求下标为 6 的字符的 next 值 
    推导过程同上 => next[6] = next[6-1] + 1 = 4 ;

    Pababaaababaa
    下标123456789101112
    next011234      

    6)求下标为 7 的字符的 next 值 
    P[7-1] = P[6] = ‘a’; 
    next[7-1] = next[6] = 4 ; 
    P[next[7-1]] = P[4] = ‘b’; 
    P[7-1] != P[next[7-1]] && 此时还未回到第一个,继续 
    next[next[7-1]] = next[4] = 2 ; 
    P[next[next[7-1]]] = P[2] = ‘b’;番外(1) 
    P[7-1] != P[next[next[7-1]]] && 但是此时还未回到第一个,继续 
    next[next[next[7-1]]] = next[2] = 1 ; 
    P[next[next[next[7-1]]]] = P[1] = ‘a’ ; 
    P[7-1] == P[next[next[next[7-1]]]] ; 
    ∴ next[7-1] = next[next[next[7-1]]] + 1 = next[2] + 1 = 2 ;

    Pababaaababaa
    下标123456789101112
    next0112342     

    7)求下标为 8 的字符的 next 值 
    P[8-1] = P[7] = ‘a’; 
    next[8-1] = next[7] = 2 ; 
    P[next[8-1]] = P[2] = ‘b’; 
    P[8-1] != P[next[8-1]] ,但是还没回到第一个元素,继续 
    next[next[8-1]] = next[2] = 1 ; 
    P[next[next[8-1]]] = P[1] = ‘a’; 
    P[8-1] == P[next[next[8-1]]]; 
    ∴ next[8] = next[next[8-1]] + 1 = 2

    Pababaaababaa
    下标123456789101112
    next01123422    

    8)求下标为 9 的字符的 next 值 
    推导过程同4) => next[9] = next[9-1] + 1 = 3 ;

    Pababaaababaa
    下标123456789101112
    next011234223   

    9)求下标为 10 的字符的 next 值 
    推导过程同4) => next[10] = next[10-1] + 1 = 4 ;

    Pababaaababaa
    下标123456789101112
    next0112342234  

    10)求下标为 11 的字符的 next 值 
    推导过程同4) => next[11] = next[11-1] + 1 = 5 ;

    Pababaaababaa
    下标123456789101112
    next01123422345 

    11)求下标为 12 的字符的 next 值 
    推导过程同4) => next[12] = next[12-1] + 1 = 6 ;

    Pababaaababaa
    下标123456789101112
    next011234223456

    (2)对应上面第二种求法 
    1)算出每一个字母前缀后缀的最大公共子串长度(下一步会把最后一位移走,所以最后一位可以不算)番外(2)

    Pababaaababaa
    前后缀最大公共子串长度00123112345 

    2)最大公共子串长度整体向后移动一个长度,最前面的元素值填 -1,即为 next 数组的第一版本

    Pababaaababaa
    next 数组第一版-100123112345

    3)(如果你需要的 next 数组第一个值为 -1,这步就可以省略了)next 数组的每一个值分别+1,即求得 next 数组。

    Pababaaababaa
    next 数组第二版011234223456
    展开全文
  • 最近因为next()遇到了不少问题,在这里记录一下 首先是路由守卫,是不是感觉简简单单 beforeEach((to, from, next) => { to //是要去的路由 from // 是当前路由 next() // 是放行的意思 } 但是在看别的项目时...
  • NextCloud安装使用心得记录

    千次阅读 2020-03-04 16:47:17
    首先假设我的NextCloud是安装在/var/www/nextcloud/目录下。 1. 安装完成后web界面无法登录 提示如下: 上文中的config.php在此目录中:/var/www/nextcloud/config/config.php 当然,不同安装方法目录路径会有不...
  • 因为采用snap工具在安装nextcloud时会默认将NextCloud的数据存储在/var/snap/nextcloud/common/nextcloud/data目录下,我们可以通过修改/var/snap/nextcloud/current/nextcloud/config/config.php的datadirectory所...
  • KMP算法讲解(next数组求解)

    万次阅读 多人点赞 2019-05-12 16:27:05
    那么,next[j]即next[10]就是待匹配串从t[0]开始到t[9]结尾的这个子串(即aabcaabcaa)中,它的前缀有很多,后缀也有很多,前缀和后缀对应相等的也有一些,不过长度最大的那个是aabcaa子串,所以next[j]=6,注意一下...
  • windows 下 nextcloud 的偏保姆级搭建教程

    千次阅读 热门讨论 2021-02-02 18:06:40
    写这个教程的时候服务的版本是Nextcloud20.0.5,Mysql8.0.23 首先到这里下载 Docker Desktop for Windows:https://hub.docker.com/editions/community/docker-ce-desktop-windows/,然后点击这个下载 docker,下载...
  • Hexo框架下用NexT(v7.0+)主题美化博客

    万次阅读 多人点赞 2019-03-19 01:36:31
    NexT主题的安装  顾名思义,所谓主题就是界面的展示样式。Hexo安装主题,只需要将主题文件拷贝至博客所在目录的themes目录下,修改相关配置文件即可生效。  NexT的安装通过定位到博客目录,再通过  Git clone ...
  • 直接搭建的文章可以参考我的这一篇博文:Centos 7.6搭建Nextcloud 17.0.0个人云盘详细教程 二、环境准备 基础环境的搭建这里不做细讲,默认环境已经安装或者拥有下面的服务和文件: Nginx服务器 docker docker-...
  • docker安装Nextcloud私有云盘

    千次阅读 2018-12-11 17:52:28
    Nextcloud简介 nextcloud是一个开源免费的私有云盘。它在功能上类似于Dropbox或者国内的百度云,允许任何人在私人服务器上安装和使用它。 安装docker和compose docker安装参考:...
  • Centos7 搭建开源个人网盘Nextcloud与常用插件

    万次阅读 多人点赞 2018-05-28 16:31:04
     像我着这种穷人,穷公司,人数不多,又不像花钱的,那么nextcloud就是最好的选择,nextcloud是owncloud的一个分支,由原创始人团队维护,是在owncloud被别的公司收购后,由创始人团队创立的新分支。就像 mysql和...
  • 如何将OnlyOffice与NextCloud集成

    千次阅读 2018-12-16 08:46:54
    原作者:XiaoGuo An 转载来源:...如何将OnlyOffice与NextCloud集成   借助于 2017年2月发布的ownCloud OnlyOffice集成应用程序,ownCloud用户可以使用OnlyOffice在线编辑器直接从他们自己的Clou...
  • KMP的next数组求法详解

    万次阅读 多人点赞 2018-07-31 20:20:05
    kmp算法的精髓就在于next数组,从而达到跳跃式匹配的高效模式。 而next数组的值是代表着字符串的前缀与后缀相同的最大长度,(不能包括自身)。 "前缀"指除了最后一个字符以外,一个字符串的全部头部组合;...
  • Nextcloud私有云盘大名鼎鼎,在此之前都是用Ftp做同步,比较Low,老婆也提意见,照片归档后也不方便查看。 那就再折腾一下这个老战友吧。 决定安装nextcloud之前,我的版本还是FreeNAS-11.1-U6,没事不去升级它,...
  • 这几天,陆续学习了解了关于vue-next(Vue 3.0)(https://github.com/vuejs/vue-next)的一些新特性,尤其是新的 CompositionAPI...
  • 详解p=q->next和p->next=q的区别,附代码

    千次阅读 多人点赞 2020-07-19 17:00:11
    将q的value和next都赋值给p意味着p和q的value值相同同时都指向q的下一个对象 (2)p.next = q 将q赋值给p.next。也就是说p的next中保存的会是q。那么p的下一个节点为q同时p与t的连接断开了 (3)p=q.next 理解为q.next...
  • 幕测平台_使用Junit测试异常,测试NextDay函数

    千次阅读 多人点赞 2020-05-02 00:59:05
    NextDay是一个简单的日期计算器,计算给定日期的下一天的具体日期。如给定2020年1月1日,返回2020年1月2日;给定2020年1月31日,返回2020年2月1日。主要要求考察学生对日期边界以及异常处理的测试的能力。 实现 ...
  • CentOS7 配置nextcloud

    千次阅读 2018-01-03 14:55:13
    下面开始为nextcloud创建数据库及用户,先登录数据库 mysql -u root -p 验证密码正确后会登录到mysql shell命令行,输入以下命令创建数据库及用户。 create database nextcloud_db; create ...
  • 刚刚开始遇到这个问题说实话完全...首先在将例子之前先说说这个next数组求解的思路:第一位的next的值是0,第二位的next的值为1,后面求解每一位的next的值时。首先将前一位与其next值对应的内容进行比较,如果相等...
  • void cal_next(char *str, int *next, int len) { next[0] = -1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀 int k = -1;//k初始化为-1 for (int q = 1; q ; q++) { while (k > -1 && str...
  • NextCloud终极优化,内网上传破100一、系统性能优化(针对界面加载优化)二.上传速度优化 一、系统性能优化(针对界面加载优化) 性能优化的详细过程已完善,请移步 Nextcloud打开缓慢\卡顿的一些优化 Nextcloud由于...
  • vue-next

    千次阅读 2019-10-24 12:54:42
    vue-next项目地址 git地址:链接 git clone git@github.com:vuejs/vue-next.git npm install npm run dev // 生成一个未压缩的状态vue文件 入门小案例 <!DOCTYPE html> <html lang="en"> <head>...
  • NextCloud的安装配置

    千次阅读 2019-02-25 09:54:49
    NextCloud工具的安装 安装NextCloud所需的运行环境LAMP(Linux、Apache、MySQL、PHP) 安装Apache2 Linux终端下执行命令sudo apt-get update 先升级所有软件的依赖信息 安装Apache2sudo apt-get ...
  • nextcloud应用 如果写作是您工作或日常工作的一部分,您可能会发现Nextcloud开源文件同步和共享应用程序是非常有用的工具。 首先,它为您提供免费,安全且易于访问的云文件存储。 其次,它是完全可定制的,这意味...
  • 树莓派搭建nextcloud

    千次阅读 2019-06-25 22:51:29
    sudo apt install apache2 sudo apt install phpmyadmin ...sudo apt install mysql-server sudo service apache2 restart sudo service mysql restart 到官网上下在nextcloud包 wget h...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,900,718
精华内容 1,160,287
关键字:

next