数据结构:笔记

1、顺序表的平均比较次数:(n+1)/ 2
解析】在顺序表中查找,最好情况下第一个元素就是要查找的元素,则比较次数为 1 ;在最坏情况下,最后一个元素才是要找的元素,则比较次数为 n 。两种情况平均即( 1+n ) /2 。

2、顺序表的平均查找长度:(n+1) /2
第一个数的比较次数为1,第二个数的比较次数为2。。。以此类推第N个数的比较次数为N,所以总的比较次数为1+2+…+N=N(N+1)/2,平均比较次数为(N+1)/2,也即平均查找长度。

3、在ASC算法team日常开发中,常常面临一些数据结构的抉择,令人纠结。目前大家在策划一个FBI项目(Fast Binary Indexing),其中用到的词汇有6200条,词汇长度在10-15之间,词汇字符是英文字母,区分大小写。请在下面几个数据结构中选择一个使检索速度最快的:
二叉搜索树,比较函数开销:1次运算/每字符
哈希表,hash算法开销:10次运算/每字符
链表,比较函数开销:1次运算/每字符

答案:TRIE树,寻找子节点开销:1次运算/每字符(正确)。
解析:
注解:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

4、下面关于查找算法的论述中哪个不是正确的?
顺序查找需要查找表为有序表
折半查找需要查找表为有序表
查找表可分为静态查找表和动态查找表
动态查找表的特点是表结构本身在查找过程中动态生成的

5、查找效率最高的二叉排序树是:
二叉查找树的查询速度取决于树的深度,相同结点数深度最小的是平衡二叉树。

6、顺序查找法适用于存储结构为顺序或链接存储的线性表。()

存储结构:
顺序存储
链式存储
索引存储
哈希(或散列)存储
顺序存储的线性表不但逻辑上连续,物理上也连续,可以使用顺序查找法。
链式存储的线性表虽然物理上不一定连续,但逻辑上连续(通过额外的指针表示逻辑相邻关系),也可以使用顺序查找法。

7、假设顺序表中包含5个关键字{a,b,c,d,e},它们的查找概率分别为{0.25,0.3,0.2,0.1,0.15},为了使查找成功时的平均查找长度达到最小,则顺序表中数据元素的出现顺序是( )
顺序表查询长度与顺序表遍历长度有关,概率越大,其在顺序表中所占长度越长,概率越大 应放在前面

8、设散列表的长度为10,散列函数H(n)=n mod 7,初始关键字序列为 (33,24,8,17,21,10),用链地址法作为解决冲突的方法,平均查找长度是 1.5
33/7=5, 查找33需要1次;
24/7=3,查找24需要1次;
8/7=1,查找8需要1次;
17/7=3,查找17需要2次;
21/7=0,查找21需要1次;
10/7=3,查找10需要3次;
ASL=每个关键字查找的次数之和/关键字的个数=(1+1+1+2+3+1)/6=1.5

9、为提高散列(Hash)表的查找效率,可以采取的正确措施是(23)。
Ⅰ.增大装填(载)因子

Ⅱ.设计冲突(碰撞)少的散列函数

Ⅲ.处理冲突(碰撞)时避免产生聚集(堆积)现象

解析:散列因子,又叫装填(装载)因子,用来描述哈希表的密集程度。
a = 元素个数 / 哈希表长度
a 越大,产生冲突的概率就越大,a越小,空间浪费就大,散列因子一般控制在0.7~0.8左右。
并不是越大越好,也不是越小越好。如果仅仅是单一为了提高查找效率,散列因子越小,查找效率越高。

10、顺序查找就是从头到尾一个一个比较,表中内容是否有序无所谓,反正都会浏览一遍直到找到为之。

11、折半查找与二元查找树的时间性能在最坏的情况下是相同的(错误)
解析:折半查找最坏的情况下查找log(n)+1次,而二叉查找树最坏的情况是查找n次。

12、KMP算法下,长为n的字符串中匹配长度为m的子串的复杂度为()
kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和 m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历O的每一个位置,然后从该位置开始和f进行匹配,但是这种方法的复杂度是 O(nm)。kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m)。

13、使用KMP算法在文本串S中找模式串P是一种常见的方法。假设S=P={xyxyyxxyx},亦即将S对自己进行匹配,匹配过程中正确的next数组是____。

严版数据结构求 next 的公式:

我们主要观察第二项,存在两种情况:

( 1 )集合为空,若集合为空,则属于公式中的第一或第三种情况(其他情况), j=1 的时候, next[1]=0 ,当 j>1 的时候, next[j]=1 。

( 2 )集合不为空,则我们要取的 k ,是集合中 k 的最大值。

K 需要满足两个条件,一是 1<k<j ,二是后面那个。

对于前面这个,不用多说,对于后面这个,如果只看形式化的公式,估计比较难理解其意义。通过阮老师的博文(http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html),不难理解,后面这个表达式的意义就是所有前缀与所有后缀中,前缀与后缀相同的情况,那么,这个 k 的取值就是前缀与后缀相等时,字符串的长度加上 1 。

先以严老师书上的例子:

求模式串 abaabcac 的 next 数组

当 j=1 时, next[1]=0 ,直接是公式的第一种情况

当 j=2 时,因为第二种情况要保证集合不为空且 1<k<j ,那么, j=2 时,集合为空,所以不符合第二种情况,因此,属于其他情况,即 next[2]=1

当 j=3 时, k 要小于 j ,所以,我们要在模式串找长度小于 j 的前面全部串的前缀与后缀相同时的最大长度,也就是在模式串中找到前两位 ab ,来找他们最长的前缀与后缀及长度,可以发现,他们没有相同的前缀与后缀,因此,长度为 0 ,而 k 等于长度加 1 ,所以 next[3]=1

当 j=4 时,在 aba 中找前缀与后缀的相同时的最大长度,可以求出最大长度Max为 1 ,所以 next[4]=2

当 j=5 时,在 abaa 中找,Max为 1 ,所以 next[5]=2

当 j=6 时,在 abaab 中找,Max为 2 ,所以 next[6]=3

当 j=7 时,在 abaabc 中找,Max为 0 ,所以 next[7]=1

当 j=8 时,在 abaabca 中找,Max为 1 ,所以 next[8]=2

之所以要找前缀与后缀,是因为我们在比较的时候,避免做多余的工作,即每次遇到主串和模式串不等时,都把模式串直接从头开始比。

以模式串为 xyxyyxxyx 为例,求 next

当 j=1 , next[1]=0

当 j=2 , next[2]=1

当 j=3 ,在 xy 中找前缀与后缀,最大长度 max 为 0 , next[3]=1

当 j=4 ,在 xyx 中找, Max 为 1 , next[4]=2

当 j=5 ,在 xyxy 中找, Max 为 2 , next[5]=3

当 j=6 ,在 xyxyy 中找, Max 为 0 , next[6]=1

当 j=7 ,在 xyxyyx 中找, Max 为 1 , next[7]=2

当 j=8 ,在 xyxyyxx 中找, Max 为 1 , next[8]=2

当 j=9 ,在 xyxyyxxy 中找, Max 为 2 , next[9]=3

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椒椒。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值