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

正定小程序制作【正定企业邮箱】正定网站外包、正定微信商城开发、正定网店美工、正定淘宝设计

发表日期: 2021-04-17 10:05:14 浏览次数:93

正定小程序制作【正定企业邮箱】正定网站外包、正定微信商城开发、正定网店美工、正定淘宝设计

正定县,河北省石家庄市辖县,位于太行山东麓的山前倾斜平原、山前冲积扇的中上部,因“真正安定”之意得名 [1-2]  ;正定县位于东经114°23′~114°43′,北纬38°6′~38°22′,总面积486平方千米,气候型为温带季风气候,四季分明,多年平均气温13.1℃,多年平均降水量550毫米 [3]  ;截至2020年10月,正定县下辖2个街道、3个镇和5个乡,境内设有中国(河北)自由贸易试验区正定片区和正定新区;截至2019年末,正定县常住人口为51.7万人 [1]  。

正定县前身为真定县,有1600多年的建城史,最初为鲜虞国都城,后为中山国都城,建县始于秦始皇统一中国后设立的东垣县,“真定”一名始于汉高祖十一年(前196年)改东垣县为真定县,最终于清雍正元年(1723年)改为现名 [2]  。正定县是京津冀城市群、石家庄都市圈的重要城镇,境内建有石家庄正定国际机场,有京广高速铁路过境 [4]  。正定县有“九楼四塔八大寺,二十四座金牌坊”,有“古建艺术宝库”美称 [1]  。

2020年上半年,正定县财政收入为35.7亿元,同比增长5.8%;一般公共预算收入为26.9亿元,同比增长10.1%;固定资产投资为116.2亿元,同比增长11%;服务业增加值为100.3亿元,同比增长11%;规模以上高新技术产业增加值达5.9亿元,同比增长18%;社会消费品零售总额达40.8亿元,同比增长10%;外贸进出口总额达91亿元,同比增长366%;城乡居民人均可支配收入分别为18146元和10260元,同比增长8.2%和8.7% [5]  。

请注意,偏序树的索引是1到MAX,而对图来说,这些索引就是从0到MAX-1。因此,在图9-46的第(3)行和第(4)行中,必须一开始就把图中的节点i 对应到偏序树的节点i+1。

9.8.5 迪杰斯特拉算法的实现

图9-47展示了迪杰斯特拉算法的代码,利用到了我们之前已经编写的所有函数。要为对应偏序树potNodes以及带有指示偏序树末端的整数last的图graph执行迪杰斯特拉算法,就要初始化这些变量,然后调用

Dijkstra(graph, potNodes, &last)复制代码

函数Dijkstra的工作原理如下。在第(1)行我们要调用initialize。其余代码,也就是第(2)行到第(13)行是个循环,该循环每次迭代都对应迪杰斯特拉算法的一轮处理,在迭代中我们要选择一个节点v 并将其解决。在第(3)行选择的节点v 总是对应树节点为偏序树根节点的那个。在第(4)行,通过交换v 与偏序树当前的最后一个节点,我们把v 从偏序树中取出。第(5)行其实是通过递减lastv 删除。然后第(6)行通过对我们刚放置到根节点位置的节点调用bubbleDown,还原了偏序树属性。事实上,未解决节点会出现在last 之下,而已解决节点则出现在last 及last 以上的位置。

      void Dijkstra(GRAPH G, POT P, int *pLast)
      {
          NODE u, v; /* v 是我们要解决的节点 */
          LIST ps; /* ps 沿着v的后继表下行,u是ps
                      指向的那个后继 */
 (1)      initialize(G, P, pLast);
 (2)      while ((*pLast) > 1) {
 (3)          v = P[1];
 (4)          swap(1, *pLast, G, P);
 (5)          --(*pLast);
 (6)          bubbleDown(1, G, P, *pLast);
 (7)          ps = G[v].successors;
 (8)          while (ps != NULL) {
 (9)              u = ps->nodeName;(10)              if (G[u].dist > G[v].dist + ps->nodeLabel) {(11)                  G[u].dist = G[v].dist + ps->nodeLabel;(12)                  bubbleUp(G[u].toPOT, G, P);
                  }(13)              ps = ps->next;
              }
          }
      }复制代码

图 9-47 迪杰斯特拉算法的主函数

在第(7)行我们开始调整距离,以反映v 现在已被解决的事实。指针p 被初始化为指向节点v 邻接表的开头。在第(9)行把变量u 置为v 的某一后继之后,我们在第(10)行测试了到u 的最短特殊路径是否经过v。只要该数据结构中由G[u].dist表示的dist (u )的旧值大于dist (v )加上弧vu 标号的和,就有这一最短特殊路径经过节点v。如果这样,那么在第(11)行,将dist (u )置为新的更小的值,并在第(12)行调用bubbleUp。所以,如果需要的话,u 可以在偏序树中上升到反映其新优先级的位置。在第(13)行中随着p 沿着v 的邻接表向下移动,该循环就随之完成了。

9.8.6 迪杰斯特拉算法的运行时间

正如之前所述那样,假设图具有n 个节点,而且m 是弧数与节点数的较大者。这里将会按照描述这些函数的次序分析每个函数的运行时间。首先,swap函数显然花费O(1)的时间,因为它只由赋值语句组成。同样priority函数也花费O(1)的时间。

bubbleUp函数是递归函数,但它的运行时间是O(1)加上对到根节点一半距离的节点递归调用该函数的时间。正如我们在5.9节中验证过的,至多存在logn 次调用,而且每次调用需要O(1)的时间,所以bubbleUp的总运行时间就是O(logn)。同样,bubbleDown也花费O(logn)的时间。

initialize函数要花O(n)的时间。具体来说就是,第(1)行到第(4)行的循环要迭代n 次,而其循环体每次迭代要花O(1)的时间。这就给了该循环O(n)的时间。第(5)行和第(6)行各自贡献了O(1)的时间,不过我们在大O表达式中可以将其省略掉。

现在把注意力转移到图9-47中的Dijkstra函数上。设mv是节点v的出度,或者说是v的邻接表的长度。我们首先分析第(8)行到第(13)行的内层循环。第(9)行到第(13)行的各行都要花O(1)的时间,除了第(12)行对bubbleUp的调用之外,我们论证过该调用要花O(logn)的时间。因此,该循环的循环体要花O(logn)的时间。该循环进行的次数等于v对应的邻接表的长度,之前已经将其表示为mv了。因此,第(8)行到第(13)行的循环的运行时间可以表示为O(1+mv logn),1这一项表示的是v没有后继,也就是mv=0的情况,不过我们还是要进行第(8)行的测试。

现在考虑第(2)行到第(13)行的外层循环。我们已经验证过第(8)行到第(13)行了。第(6)行调用bubbleDown需要的时间。而循环体的其他各行都只要O(1)的时间,因此整个循环体需要花上O((1+mv)logn)的时间。

外层循环刚好要迭代n-1次,因为last的范围是从n 减少到2。1+mv 中的1这一项因此要贡献n-1,或者说是O(n)的时间。不过,mv 这项一定要为各个节点v 相加,因为所有节点(除了最后一个节点)都要被选作一次v。因此,mv 对外层循环所有迭代的总贡献是O(m),因为有\sum_vm_v\leq m。由此可以得出外层循环要花O(m logn)的时间。第(1)行对initialize的调用要花O(n)的时间,不过可以将其省略。这样一来就得到迪杰斯特拉算法的运行时间为O(m logn),也就是说,至多是查看图中的节点和弧所花时间的logn 倍。

9.8.7 习题

1. 按照图9-21中所示的图(见9.4节的习题),找到从底特律到其他城市的最短距离。如果某城市是从底特律不可达的,则这个最小距离为“无限”。

2. 有时候我们希望计算从一个节点到另一个节点遍历的弧的数量。例如,我们可能希望把在乘飞机或坐公交车出行过程中的换乘次数减少到最小。如果给每条弧标记上1,那么最小距离计算就会变成数弧的过程。为图9-5中的图(见9.2节的习题)找出从节点a到达各节点所需要的最小弧数。

3. 图9-48a中有7个灵长类物种以及它们名称的缩写。这些物种中的某些物种已知要先于其他物种出现,因为在同一地点代表时间流逝的不同地层中发现了它们的化石。图9-48b中的表给出的三元组(xyt )表示物种x 与物种y 是在同一地点被发现,不过x 要比y 早t 百万年出现。

(a) 画出表示图9-48中数据的有向图,其中弧是从较早的物种到达较晚的物种,弧的标号就表示物种间的时间差异。

(b) 以AF为源节点,对(a)小题画出的图运行迪杰斯特拉算法,找到AF之后的各其他物种与它相差的最短时间。

4. * 我们给出的迪杰斯特拉算法的实现需要O(m logn)的时间,这一时间要小于O(n2)的时间,除了弧的数量接近n2的情况之外。如果m 很大,就可以谋划另一种不需要用到优先级队列的实现,这样在每一轮处理中就不再需要O(n)的时间选择要解决的节点,而只需要O(mu)的时间,也就是与从已解决节点u 出发的弧的数量成正比的时间,来更新dist。得到的是一种O(n2)时间的算法。完善这里提出的思路,并为迪杰斯特拉算法的这种实现编写C语言程序。


正定小程序制作正定企业邮箱正定网站外包、正定微信商城开发、正定网店美工、正定淘宝设计

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

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

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

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

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

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

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

预约专家

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

  

服务热线:400-111-6878