
发表日期: 2021-04-17 09:16:50 浏览次数:153
赵县企业微信公众号小程序开发公司、赵县企业网页设计方案、赵县做网站开发价格、赵县微信公众号制作运营报价明细表、赵县网站设计公司费用、赵县网站推广大概需要多少钱
赵县,隶属于河北省石家庄市,古称赵州,地处石家庄市区东南40公里,总面积为675平方公里,总人口61.3万(2017年),辖11个乡镇、281个行政村。县府驻赵州镇。汉为平棘县,晋为赵国,北魏置赵郡,曾为赵州治,隋改为赵州。1913年改为赵县。赵县历史悠久,文物众多,共有文物保护单位21处。
县境位于河北平原,光热充足,地下水丰富,利于井灌,又有石津渠灌溉之利,一年四季分明,春秋两季时间短,夏冬两季时间长。东部为沙质褐土,适于雪花梨生长。赵县农业发达,玉米、小麦是主要粮食产品。特产雪花梨俗称象牙梨,个大,皮薄、汁多、含糖分高,成熟后洁白如雪,故名,是河北省大宗出口的优质水果之一。
2018年12月27日,经河北省人民政府研究,同意灵寿县、赵县、阳原县县城为河北省园林县城。 [1] 2019年3月,被列为第一批革命文物保护利用片区分县名单。
3不要把该函数与第2章和第3章中用于归并排序的同名函数弄混了。
找出连通分支的算法的核心内容如图9-20所示。假设函数makeEdges()会把手头的图转换成由图中的边组成的链表,这里并未展示该函数的代码。
#include <stdio.h>
#include <stdlib.h>
#define MAX 13
typedef int NODE;
typedef struct EDGE *EDGELIST;
struct EDGE {
NODE node1, node2;
EDGELIST next;
};
typedef struct TREENODE *TREE;
struct TREENODE {
int height;
TREE parent;
};
TREE find(NODE a, TREE nodes[]);
void merge(TREE x, TREE y);
EDGELIST makeEdges();
main()
{
NODE u;
TREE a, b;
EDGELIST e;
TREE nodes[MAX];
/* 初始化节点,使得每个节点都在由其自身构成的树中 */
(1) for (u = 0; u < MAX; u++) {
(2) nodes[u] = (TREE) malloc(sizeof(struct TREENODE));
(3) nodes[u]->parent = NULL;
(4) nodes[u]->height = 0;
}
/* 将e初始化为存放图中各边的表 */
(5) e = makeEdges();
/* 检查每条边,如果边的的端点在不同组分中,就将它们
合并 */
(6) while (e != NULL) {
(7) a = find(e->node1, nodes);
(8) b = find(e->node2, nodes);
(9) if (a != b)(10) merge(a, b);(11) e = e->next;
}
}复制代码图 9-20 用来找出连通分支的C语言程序
用来找出连通分支的更优算法
我们会在9.6节中研究深度优先搜索时看到,其实还有更好的方法来计算连通分支,它只需要花费O(m)的时间,而不是O(m logn)的时间。不过,9.4节中给出的数据结构本身也很实用,我们在9.5节中就要看到另一个使用该数据结构的程序。
图9-20的第(1)行到第(4)行会浏览数组nodes,而在第(2)行会为每个节点创建一个树节点。在第(3)行其parent字段会被置为NULL,表示它是其自身构成的树的根节点,而在第(4)行会将其height字段置为0,以反映出在由该节点自己构成的树中就只有它这一个节点。
然后第(5)行会把e初始化为指向边链表中的第一条边,而且第(6)行到第(11)行的循环会一次检查每一条边。在第(7)行和第(8)行,我们找到了当前边两个端点的根节点。接着在第(9)行要测试这些根节点是否为不同的树节点。如果是,那么当前边的两个端点在不同分支中,而且我们要在第(10)行合并这些分支。如果该边的两个端点在同一分支中,就跳过第(10)行,因此就不会对树集合造成任何改变。最后,第(11)行会带着我们沿着边链表行进。
我们来确定一下图9-20所示的算法处理一幅图要花多长时间。假设该图有n 个节点,并设节点数和边数的较大者为m。4首先看看这些辅助函数。我们论证过,将高度较低的树合并到高度较高的树中的策略可以保证从任意树节点到达其根节点的路径都不会比logn长。因此,find会花费O(logn)的时间。
4把m 当作边的数量是很正常的,不过在某些图中,节点比边更多。
接下来要查看图9-19中的函数merge。它的每条语句都花费O(1)的时间。因为其中不含循环或函数调用,所以整个函数也只花O(1)的时间。
最后来看看图9-20所示的主程序。第(1)行到第(4)行的for循环循环体要花费O(1)的时间,而且该循环要迭代n 次。因此,第(1)行到第(4)行所花的时间是O(n)。假设第(5)行要花费O(m)的时间。最后,考虑一下第(6)行到第(11)行的while循环。在循环体中,第(7)和第(8)行每行都要花费O(logn)的时间,因为它们都调用了函数find,而我们刚刚已经确定过find要花费O(logn)的时间。第(9)行和第(11)行显然只要O(1)的时间。第(10)行同样只要O(1)的时间,因为我们刚刚确定了merge花费O(1)的时间。因此,整个循环体要花费O(logn)的时间。而while循环会迭代m 次,其中m 是边的数量。因此,该循环的运行时间就是O(m logn),也就是迭代的次数乘以循环体运行时间的边界。
然后,一般来说,整个程序的运行时间可以表示为O(n+m+m logn)。不过,m 至少是n,所以m logn 这一项就主导了其他两项。因此,图9-20所示程序的运行时间就是O(m logn)。
1. 图9-21列出了密歇根州的一些城市以及它们之间的公路里程数。就本习题的目的而言可以忽略里程数。以本节描述的方式检查每条边,构建该图的连通分支。
2. * 通过对k 的归纳证明,有k 个节点的连通分支至少有k-1条边。
城市1 | 城市2 | 距离 |
|---|---|---|
马凯特(Marquette) | 苏圣玛丽(Sault Ste. Marie) | 153 |
萨吉诺(Saginaw) | 弗林特(Flint) | 31 |
大急流城(Grand Rapids) | 兰辛(Lansing) | 60 |
底特律(Detroit) | 兰辛(Lansing) | 78 |
埃斯卡诺巴(Escanaba) | 苏圣玛丽(Sault Ste. Marie) | 175 |
安娜堡(Ann Arbor) | 底特律(Detroit) | 28 |
安娜堡(Ann Arbor) | 巴特尔克里克(Battle Creek) | 89 |
巴特尔克里克(Battle Creek) | 卡拉马祖(Kalamazoo) | 21 |
梅诺米尼(Menominee) | 埃斯卡诺巴(Escanaba) | 56 |
卡拉马祖(Kalamazoo) | 大急流城(Grand Rapids) | 45 |
埃斯卡诺巴(Escanaba) | 马凯特(Marquette) | 78 |
巴特尔克里克(Battle Creek) | 兰辛(Lansing) | 40 |
弗林特(Flint) | 底特律(Detroit) | 58 |
图 9-21 密歇根州某些城市间的距离
3. * 有一种更简单的方法实现“合并”和“寻找”,在使用这种方法时,要使用以节点为索引的数组,给出每个节点的分支。一开始,每个节点都在由它自己构成的分支中,而且我们要用相应的节点来为这种分支命名。要找到节点的分支,只要查找对应的数组项即可。要合并分支,就要沿数组向下行进,将所有出现第一个分支的地方都改为第二个分支。
(a) 编写C语言程序实现这一算法。
(b) 该程序的运行时间是多少?将其表示为节点数n与节点数和边数较大值m的函数。
(c) 对某些边数和节点数而言,这种实现其实比本章中描述的实现还要好。什么时候这种实现更好?
4. * 假设本节的连通分支算法中不是将较低的树合并到较高的树中,而是将节点较少的树合并到节点较多的树中。这种连通分支算法的运行时间是否仍为O(m logn)?

赵县企业微信公众号小程序开发公司、赵县企业网页设计方案、赵县做网站开发价格、赵县微信公众号制作运营报价明细表、赵县网站设计公司费用、赵县网站推广大概需要多少钱
服务热线
顶部
备案号: 苏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