
发表日期: 2021-04-14 15:38:19 浏览次数:119
张北网站制作要多少钱【域名企业邮箱服务器注册申请办理】张北网络优化公司哪家好、张北软件开发外包价格、张北高端企业网站页面制作设计专业公司、张北微信公众号小程序购物支付搭建制作公司
河北省张家口市张北县地处河北省西北部,内蒙古高原南缘的坝上地区,境域东西109公里,南北67公里,东南部与崇礼区交界,桦皮岭为全县最高点,海拔2128米;北、中部地势平坦,向西北渐低,安固里淖为最低点,海拔1300米。全县总面积4185平方公里,辖18个乡镇、366个行政村、1167个自然村,总人口37.2万人。居民以汉族为主,占总人口的98%,还有蒙古族、回族、满族等。张北县是离京津地区最近的高原地区,夏天气候凉爽是避暑胜地。
张北县被列为第一批国家新型城镇化综合试点地区。 [1] 2019年11月,入选第二批节水型社会建设达标县(区)名单。 [2] 2020年2月29日,退出贫困县序列,正式脱贫“摘帽”。 [3] 2020年12月,入选河北省数字乡村试点地区名单。
1. 为(a)图6-4中delete函数,(b)图6-5中insert函数的运行时间建立递推关系。它们的解各是多少?
2. 为使用带重复链表的词典操作插入、查找和删除编写C语言函数。
3. 为如图6-6那样使用已排序表的插入和删除操作编写C语言函数。
4. 编写C语言函数,使其能在双向链表中由p 指向的单元之后的新单元中插入元素x。图6-9是用于删除的相似函数,不过对插入操作来说,我们不需要知道表头L。
5. 如果使用双向链表数据结构,一种选择是不通过指向单元的指针表示表,而通过具有未使用element字段的单元来表示。请注意,这一“表头”单元本身并非表的一部分。该“表头”的next字段指向该表真正的第一个单元,而这第一个单元的previous字段则指向该“表头”单元。然后可以在不知道表头L(正是我们在图6-9中需要知道的)的情况下删除由指针p指向的单元,而不是那个未使用element字段的“表头”。编写C语言函数,使其利用这里描述的格式从双向链表中删除元素。
6. 编写递归函数,实现使用链表数据结构的(a)retrieve (i ,L );(b)length (L );(c)last (L )。
7. 扩展下列函数,使其单元可以接受任意类型ETYPE的元素,使用函数eq (x,y )测试x 和y 是否相等,并用lt (x,y )分辨x 是否在ETYPE类型元素的次序下先于y。
(a) 图6-3中的lookup 。
(b) 图6-4中的delete 。
(c) 图6-5中的insert 。
(d) 使用带重复表的insert、delete 和lookup 。
(e) 使用已排序表的insert、delete 和lookup 。
实现表的另一种常见方式是创建由下列两部分组成的结构体。
1. 存放元素的数组;
2. 记录表中当前元素数量的变量length。
图6-10展示了如何使用数组A[0..MAX-1]表示表(a0,a1,…,an-1)。元素a0、a1、…、an-1存储在A[0..n-1]中,而且length=n。

图 6-10 存放表(a0,a1,…,an-1)的数组A
就像在6.4节中那样,我们假设表中元素都是整数,并邀请读者将这些函数一般化为支持任意类型。表基于数组的实现所使用结构体的声明如下
typedef struct {
int A[MAX];
int length;} LIST;复制代码这里的LIST是包含两个字段的结构体,第一个字段是存储元素的数组A,而第二个则是含有表中当前元素数目的整数变量length。MAX是个用户定义的常量,用于为存储在表中的元素的数目确定边界。
与表的链表表示相比,基于数组的表示从多个方面讲都更方便。不过,它会受到表不能长过数组的限制,这可能导致插入操作失败。在链表表示中,只要有可用的计算机内存,就可以让表增长到尽可能长。
对基于数组的表执行词典操作,所花的时间与对链表表示的表执行这些操作所花的时间基本相同。要插入x,先查找x。如果没找到x,就要检查是否有length< MAX。如果length 不小于MAX,就有出错的情况,因为没法将新元素装入数组中。否则,我们将x 存储在A[length]中,并将length 增加1。要删除x,还是先查找x,如果找到,就将数组A中x 之后的元素都下移一个位置,然后将length 减1。插入和删除的具体函数实现留作本节习题。接下来要介绍查找操作的细节。
图6-11是实现查找操作的函数。因为数组A可能很大,所以选择传递指向LIST类型结构体的指针pL作为lookup 的形式参数。在该函数中,结构体的两个字段可以称为pL->A[i]和pL->length。
从i=0开始,第(1)至第(3)行的for循环会依次检查数组的每个位置,直到它到达最后出现的位置,或是找到x。如果找到x,就返回TRUE。如果它检查了表中的每个元素而没有找到x,就会在第(4)行返回FALSE。这种查找方法叫作线性查找或顺序查找。
BOOLEAN lookup(int x, LIST *pL)
{
int i;(1) for (i = 0; i < pL->length; i++)(2) if (x == pL->A[i])(3) return TRUE;(4) return FALSE;
}复制代码图 6-11 通过线性查找进行查找操作函数
不难理解,如果x 在表中,那么在找到x 之前,平均要查找数组A[0..length-1]的一半。因此,设n 为length的值,那么执行一次查找要花O(n)的时间。如果x 未出现,就要查找完整个数组A[0..length-1],再次需要O(n)的时间。这样的表现,与对用链表表示的表执行查找操作的表现是一样的。
常数因子在实际应用中的重要性
纵观第3章,我们一直在强调运行时间的大O度量的重要性,而且可能给大家留下了这样的印象:大O是唯一的影响因素,或是说任何O(n)算法在执行某项任务时都和其他O(n)算法有着同样的表现。不过在这里,在对哨兵的讨论中,以及其他几节中,我们都会细究隐藏在O(n)之中的常数因子。原因很简单。尽管运行时间的大O度量主导了常数因子,但研究该主题的人都能很快地了解这一点。例如,我们了解到只要n 大到足以产生影响,就要使用具有O(n logn)运行时间的排序。软件性能上的竞争优势,往往源于对具有正确“大O”运行时间的算法中的常数因子的改进,而这种优势通常能决定软件产品的成败。
通过将x 临时插入表的末尾,可以简化图6-11中for循环的代码,并为该程序提速。在表末端的这个x 就叫作哨兵(sentinel)。这项技术最先是在3.6节附注栏内容“更具防御性的程序设计”中提到的,而它在这里有着重要的应用。假设在表的末端始终有一个额外的槽,就可以使用图6-12中的程序查找x。该程序的运行时间仍为O(n),但比例常数更小,因为图6-12所示程序的循环体和循环测试所需的机器指令数,通常小于图6-11所示程序所需的。
BOOLEAN lookup(int x, LIST *pL)
{
int i;(1) pL->A[pL->length] = x;(2) i = 0;(3) while (x != pL->A[i])(4) i++;(5) return (i < pL->length);
}复制代码图 6-12 进行带哨兵查找的函数
第(1)行将哨兵放置在刚好越过该表的位置。请注意,因为length不会发生改变,所以这个x 并非真正是表的一部分。第(3)和第(4)行的循环会增加 i,直到我们找到x。请注意,因为设置了哨兵,所以即便表是空表,还是保证能找到x。在找到x 之后,第(5)行会测试是找到了表中真正出现的x(也就是,i < length),还是找到了哨兵(也就是,i < length)。请注意,如果使用哨兵,就一定要严格保证length 小于MAX,否则就没有位置放置哨兵了。
假设表L中的元素a0、a1、…、an-1已经按照非递减次序排好序。如果该已排序表存储在数组A[0..n-1]中,就可以利用二叉查找技术,从而带来可观的速度提升。我们首先必须找到中间元素的下标m,也就是说m=[(n-1)/2]。4然后将元素x与A[m ]相比较。如果它们相等,就已经找到x 了。如果x< A[m ],就递归地重复对子表A[0..m-1]的查找。如果x>A[m ],就递归地重复对子表A[m+1..n-1]的查找。无论何时尝试查找空表,都会报错。图6-13展示了分区过程。
4⌊a⌋表示a 向下取整,就是a 的整数部分。因此⌊6.5⌋=6,而且⌊6⌋=6。而⌈a⌉表示a 向上取整,是大于等于a 的最小整数。例如⌈6.5⌉=7,而⌈6⌉=6。
函数binsearch的代码要将x 放置在如图6-14所示的已排序数组A 中。该函数使用变量low和high表示x 可能出现的区域的下界和上界。如果较低的区域超过了较上的区域,那么就没找到x,此时函数就会终止并返回FALSE。
否则,binsearch会通过mid=⌊(low+high)/2⌋计算该区域的中点。然后该函数会检查区域正中的元素A[mid ],以确定x 是否在该位置。如果x 不在该位置,而且小于A[mid ],就继续在中点下方的区域查找,要是x 大于A[mid ],就继续在中点上方的区域查找。这一思路概括了图6-13所示的划分,其中low 是0,而high 是n-1。

图 6-13 二叉查找将区域一分为二
利用归纳断言“如果x 在数组中,那么它一定出现在A[low..high]这个区域内”,就可以证明函数binsearch的正确性。证明过程要对high-low 的差进行归纳,这留作本节的习题。在每次迭代中,binsearch 要么
张北网站制作要多少钱【域名企业邮箱服务器注册申请办理】张北网络优化公司哪家好、张北软件开发外包价格、张北高端企业网站页面制作设计专业公司、张北微信公众号小程序购物支付搭建制作公司
服务热线
顶部
备案号: 苏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