当前位置: 网站首页>小程序开发>网站开发

定州网站制作要多少钱【域名企业邮箱服务器注册申请办理】定州网络优化公司哪家好、定州软件开发外包价格、定州高端企业网站页面制作设计专业公司、定州微信公众号小程序购物支付搭建制作公司

发表日期: 2021-04-13 15:00:07 浏览次数:121

定州网站制作要多少钱【域名企业邮箱服务器注册申请办理】定州网络优化公司哪家好、定州软件开发外包价格、定州高端企业网站页面制作设计专业公司、定州微信公众号小程序购物支付搭建制作公司


定州市,河北省辖县级市,由保定市代管, [1]  是河北省省直管县(市)体制改革试点县(省直管县行政区划隶属关系不变 [2]  ), [3-4]  是全省重点培育的新兴区域中心城市。连续4年获评全国中小城市投资潜力百强、新型城镇化质量百强,晋级全国科技创新百强,入围全国县域经济强县。面积1283平方公里,截至2019年,定州市常住总人口123.09万人,辖25个乡镇(办),542个村(社区)。 [5-6] 

定州市位于京津冀经济区,是京津冀经济区重要节点城市 [7]  ,国家新型城镇化综合试点地区 [8]  ,河北省十二五规划重点培育的现代化中等城市 [9]  ,河北省十大历史文化名城之一。

2019年,定州市户籍总户数37.3万户,户籍总人口124.1万人,比上年增加0.3万人。常住总人口123.09万人,比上年末增加0.4万人。 [6]  2019年,定州市生产总值实现3330429万元,比上年增长7.1%。按常住人口计算,定州市人均地区生产总值为27101元。 [6]  2020年9月,入选河北省食品产业强县(市、区)(培育型)名单。 [10]  2020年12月,入选河北省数字乡村试点地区名单。


同样,fact(2)接着将控制权返回给fact(3),而且对应fact(2)的活动记录会被弹出栈。而返回值2会乘上fact(3)对应的n,得出返回值6。然后,fact(3)返回,并将其返回值乘以fact(4)中的n,得到返回值24。运行时栈现在成了:

至此,fact(4)返回到某假设的调用函数,其活动记录(未表示出来)在栈中正位于fact(4)之下。不过,它会接收返回值24作为fact(4)的值,并继续自己的执行。

习题

1. 考虑一下图6-27中的C语言程序。main函数的活动记录含有对应整数i的槽。而sum的活动记录中的重要数据包括:

(a) 参数i

(b) 返回值;

(c) 未命名的临时区域,我们称为temp,用来存储sum(i+1)的值。sum(i+1)是在第(6)行中计算的,而且之后会与A[i ]相加以形成返回值。

假设A[i ]的值为10i,给出紧邻每次对sum的调用之前和之后活动记录栈的情况。也就是说,给出紧接在压入sum的活动记录之后,且刚要从栈中弹出一个活动记录之前栈的情况。大家无需每次都给出底层(对应main函数的)活动记录的内容。

     #define MAX 4
     int A[MAX];
     int sum(int i);

     main()
     {
         int i;(1)      for (i = 0; i < MAX; i++)(2)          scanf("%d", &A[i]);(3)      printf("%d\n", sum(0));
     }

     int sum(int i)
     {(4)          if (i >= MAX)(5)              return 0;
             else(6)              return A[i] + sum(i+1);
     }复制代码

图 6-27 习题(1)的程序

2. *图6-28所示的delete函数会删除链表中第一次出现的整数x,链表由定义如下的普通单元组成:

delete的活动记录由参数xpL组成。不过,因为pL是指向表的指针,所以活动记录中第二个参数的值不是指向表中第一个单元的指针,而是另一个指针,它指向的是指向第一个单元的指针。通常,活动记录会存放指向某个单元next字段的指针。在从其他某个函数调用delete(3,&L),而且L是指向链表(1,2,3,4)第一个单元的指针时,给出栈的序列。

void delete(int x, LIST *pL){
    if ((*pL) != NULL)
        if (x == (*pL)->element)
            (*pL) = (*pL)->next;
        else
            delete(x, &((*pL)->next));}复制代码

图 6-28 习题(2)的程序

6.8 队列

另一种基于表数据模型的抽象数据类型是队列。这是一种形式受限的表,它的元素只能从后端插入,并从前端删除。术语“FIFO表”(先入先出表)就是指队列。

对队列的直观想法就是出纳员窗口前的队伍。人们从尾部进入队伍,并在到达队首时接受服务。与栈不同的是,队列是很公平的,人们是按照进入队伍的顺序接受服务的。因此,等待得最久的那个人就是下一个接受服务的人。

6.8.1 对队列的操作

队列使用的抽象模型与表(或栈)使用的抽象模型是相同的,不过对队列执行的操作却是特殊的。队列具有两种特有的操作,入队(enqueue)和出队(dequeue)。enqueue (x )会将x 添加到队列后端,而dequeue 则会从队列前端删除元素。就像栈那样,我们还会需要将其他一些实用操作应用到队列上。

Q 是元素类型皆为ETYPE的队列,并设x 是ETYPE类型的元素。我们要考虑以下对队列的操作。

1. clear (Q )。将队列Q 置空。

2. dequeue (Q,x )。如果Q 为空,返回FALSE;否则,将x 置为Q 前端元素的值,并将该元素从Q中删除,然后返回TRUE

3. enqueue (x,Q)。如果Q 已满,返回FALSE;否则,将元素x 添加到Q 的后端,并返回TRUE

4. isEmpty (Q)。若Q 为空则返回TRUE,否则返回FALSE

5. isFull (Q)。若Q 已满则返回TRUE,否则返回FALSE

就像栈那样,我们可以给出更具“信任度”的enqueue 和dequeue,其中enqueue 不会检查队列是否已满,而dequeue 不会检查队列是否为空。enqueue 不再返回值,而dequeue 则只接受Q 作为参数,并返回被请出队列的值。

6.8.2 队列的链表实现

用于队列的一种实用数据结构是基于链表的。首先是由宏给出的单元定义

DefCell(int, CELL, LIST);复制代码

一如本章前面的内容,假设队列中的元素都是整数,并请读者自己将我们的函数一般化为处理任意元素类型。

队列的元素将存储到链表的单元中。队列本身是具有两个指针的结构,一个指向前端单元,也就是链表的第一个单元;另一个指向后端单元,也就是链表的最后一个单元。这就是说,有如下定义

typedef struct {
    LIST front, rear;} QUEUE;复制代码

如果队列为空,front就将是NULL,而rear的值就无关紧要了。

更多的抽象数据类型

可以将栈和队列加到5.9节中引入的抽象数据类型表中。我们在6.6节中介绍了栈使用的两种数据结构,并在6.8节中介绍了队列使用的一种数据结构。而6.8节的习题(3)则提到了实现数组的另一种数据结构,“循环数组”。

抽象数据类型

队列

抽象实现

数据结构

1) 链表
2) 数组

1) 链表
2) 循环数组

图6-29给出了实现本节所提队列操作的程序。请注意,在使用链表时,就没有“满”队列的概念了,这样一来isFull 总会返回FALSE。不过,如果使用某种基于数组的队列实现,就可能会有满队列。

6.8.3 习题

1. 给出从空队列开始,在执行操作序列enqueue (a )、enqueue (b )、dequeueenqueue (c )、enqueue (d )、dequeueenqueue (e )、dequeue 、dequeue 之后剩下的队列。

2. 证明图6-29中的各函数都能在O(1)时间内执行,而不需要考虑队列的长度。

3. * 可以用数组表示队列,只要队列不会增长得太长。为了让操作只花O(1)的时间,必须将数组视为循环的。也就是说,数组A[0..n-1]要被视为A[1]A[0]之后、A[2]A[1]之后,以此类推,直到A[n-1]A[n-2]之后,不过还有A[0]A[n-1]之后。队列可以用表示队列前端元素和后端元素位置的一对整数frontrear表示。空队列可以表示为在循环的情况下,front 的位置紧邻rear 之后,例如front =23且rear =22,或是front =0且rear =n-1。请注意,因此该队列不是有n 个元素,否则该条件也可以由rear 紧跟front 之后来表示。因此,当该队列有n-1个元素,而不是有n 个元素时,它就已经满了。假设使用循环数组数据结构,为这些队列操作编写函数,不要忘了检查满队列和空队列。

4. * 证明:如果(a1,a2,…,an)是以a1为前端的队列,那么对i=1,2,…,n-1而言,ai 是在ai+1之前入队的。

void clear(QUEUE *pQ){
    pQ->front = NULL;}BOOLEAN isEmpty(QUEUE *pQ){
    return (pQ->front == NULL);}BOOLEAN isFull(QUEUE *pQ){
    return FALSE;}BOOLEAN dequeue(QUEUE *pQ, int *px){
    if (isEmpty(pQ))
        return FALSE;
    else {
        (*px) = pQ->front->element;
        pQ->front = pQ->front->next;
        return TRUE;
    }}BOOLEAN enqueue(int x, QUEUE *pQ){
    if (isEmpty(pQ)) {
        pQ->front = (LIST) malloc(sizeof(struct CELL));
        pQ->rear = pQ->front;
    }
    else {
        pQ->rear->next = (LIST) malloc(sizeof(struct CELL));
        pQ->rear = pQ->rear->next;
    }
    pQ->rear->element = x;
    pQ->rear->next = NULL;
    return TRUE;}复制代码

图 6-29 实现链表队列操作的例程

6.9 最长公共子序列

本节专门探讨一个与表有关的有趣问题。假设有两个表,而我们想知道这两者之间有何差异。该问题会以很多不同的形式出现,也许最常见的就是两个表分别表示某文本文件的两个版本,并希望确定两个版本有哪几行相同的情况。为简便起见,纵贯本节我们都将假设这些表是字符串。

考虑这一问题的一种实用方式就是将两个文件当作符号序列,x=a1am 和y=b1bn,其中ai 表示第一个文件中的第i 行,而bj 表示第二个文件的第 j 行。因此,像ai 这样的抽象符号其实也许是个“大”对象,有可能是一整句话。

UNIX命令diff就可以比较两个文本文件的区别。文件x 可能是某程序当前的版本,文件y 则可能是该程序在经过某次细小修改之前的版本。可以使用diff提醒自己在将y 变为x 时进行的修改。对文本文件的常见修改有:

1. 插入一行;

2. 删除一行。

而文本行的修改可以视为删除一行之后紧接着插入一行。

通常,当一个文本文件转化为另一个时,如果对两个文本文件间发生的少量改变加以检验,很容易发现哪些文本行是与哪些行对应的,且很容易看出哪些文本行被删除了以及哪些文本行是新插入的。diff命令作出了这样的假设,用两个表表示两个文本文件,表中元素是文本文件中的文本行,于是可以通过首先找出两个表的最大公共子序列(Longest Common Subsequence,LCS)来确定都有哪些改变。LCS表示那些没有修改过的文本行。

回想一下,子序列是在保留剩余元素次序的前提下从表中删除0个或多个元素得到的。两个表的公共子序列就是同为两者子序列的表,而两个表的最长公共子序列就是两个表公共子序列中最长的那个。

示例 6.12

在下文的内容中,我们可以将abc这样的字符视为表示文本文件中的文本行,或者如果愿意的话,视作其他类型的元素。举例来说,babacbba都是abcabbacbabac的最长公共子序列。可以看到,babaabcabba的子序列,因为从abcabba中选取位置2、4、5和7就能形成baba。字符串baba也是cbabac的子序列,因为可以选择位置2、3、4和5。同样,cbba是由abcabba的位置3、5、6和7形成的,也是由cbabac的位置1、2、4和5形成的。因此cbba也是这些字符串的公共子序列。我们必须相信,这就是最长公共子序列,也就是说,没有长度为5或更长的公共子序列了。这一事实可由接下来要描述的算法得出。

6.9.1 对LCS计算的递归

我们提供了两个表LCS长度的递归定义。该定义使LCS长度的计算变得很容易,而且,通过检验它构建的表,可以发现一个可能的LCS,而不只是其长度。由该LCS,可以推断出文本文件发生了什么变化,本质上讲,不属于LCS的部分都是变化。

要找出表x 和表y 某个LCS的长度,就需要弄清所有前缀(一个来自x,另一个来自y)对LCS的长度。回想一下,前缀是以表首字母开头的子表,也就是说,cbabac的前缀就是εccbcba,等等。假设x=(a1,a2,…,am )而且y=(b1,b2,…,bn )。对每个i 和每个j,其中i 在0到m 之间,而j 在0到n 之间,都可以要求来自x 的前缀(a1,…,ai )和来自y 的前缀(b1,…,bj )的LCS。

如果i 或 j 之中有一个为0,那么其中一个前缀就是ε,这样两个前缀唯一可能的公共子序列就是ε。因此,当i 或 j 之中有一个为0时,LCS的长度就是0。这一直观结果可以转化为在LCS计算方式的非正式讨论之后的归纳中依据和规则(1)的正式形式。

现在考虑一下i 和 j 都大于0的情况。最好将LCS视为两个字符串的某些位置间的匹配。也就是说,对LCS的每个元素而言,都可以将该元素在两个字符串中各自所在的位置匹配起来。匹配过的位置必须具有相同的符号,而且匹配过的位置之间的文本行一定不能交叉。

示例 6.13

图6-30a展示了字符串abcabbacbabac两种可能匹配中对应公共子序列baba的那种,图6-30b则展示了对应cbba的匹配。

{%}

图 6-30 表示为位置间匹配的LCS

因此,我们来考虑前缀(a1,…,ai )和(b1,…,bj )之间的匹配。存在如下两种情况,具体取决于两个表的最后一个符号是否相等。

(a) 如果ai ≠bj,那么匹配中就不可能同时含有ai 和bj,因此(a1,…,ai )和(b1,…,bj )的LCS一定是下列两者之一。

(i) (a1,…,ai-1)和(b1,…,bj )的LCS;

(ii) (a1,…,ai )和(b1,…,bj-1)的LCS。

如果已经得出了上述两对前缀的LCS的长度,就可以取其中的较大值作为(a1,…,ai )和(b1,…,bj )的LCS的长度。这种情况将成为接下来的归纳中正式的规则(2)。

(b) 如果ai =bj,就可以匹配ai 和bj,而且该匹配将不会妨碍其他任何可能的匹配。因此,(a1,…,ai )和(b1,…,bj )的LCS的长度,要比(a1,…,ai-1)和(b1,…,bj-1)的LCS的长度大1。这种情形将成为接下来的归纳中正式的规则(3)。

这些直观结果让我们给出了Li , j )——(a1,…,ai )和(b1,…,bj )的LCS的长度——的递归定义。其中利用了对i+j 的和的完全归纳。

c51c866ffa1ab3457f2021e8bbdbcc1.jpg

定州网站制作要多少钱域名企业邮箱服务器注册申请办理定州网络优化公司哪家好、定州软件开发外包价格、定州高端企业网站页面制作设计专业公司、定州微信公众号小程序购物支付搭建制作公司

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: https://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878