软件设计师 第八章 算法与数据结构

一、数组、矩阵和广义表

二维数组a[1…N,1…N]的元素布局如下: 在按行存储方式下,a[ij]之前的元素个数为(i-l)*N+j-l;
按列存储方式下,a[ij] 之前的元素个数为(j-l)*N+i-l。
若i=j,则a[ij]是主对角线上的元素,显然(i-l)*N+j-l 与(j-l)*N+i-l相等。
若i<j,则a[ij]是上三角区域的元素;
若i>j,则a[i,j]是下三角区域的元素,这两种情况下,存储在a[i,j]之前的元素个数分别为和(j-l)*N+i-1, 其大小关系依赖于i和j的具体取值。

二、 图

  1. 邻接表中,所以时间复杂度是O(n+e)。
    邻接矩阵中,算法需要遍历邻接矩阵的每一个点,而邻接矩阵有nn个点,所以时间复杂度是**O(nn)**。

  2. 对有向无环图网进行拓扑排序的方法如下:
    ①在AOV网中选择一个入度为零(没有前驱)的顶点v且输出它;
    ②从网中删除该顶点v以及与该顶点有关的所有边;
    ③重复上述两步,直至网中不存在入度为零的顶点为止。
    按照上述方法,拓扑序列的第一个顶点为4,执行①和②步之后的有向图如下图(a)所示。接下来再输出的顶点只能为1,因此执行①和②步之后的有向图如下图(b)所示。接下来再输出的顶点只能为2,因此①和②步之后的有向图如下图(c)所示。因此,拓扑序列为4 1 2 3 5。
    在这里插入图片描述

三、树

  1. 在计算机信息处理中,“哈夫曼编码”是一种一致性编码法(又称“熵编码法”),用于数据的无损耗压缩。

  2. 逆波兰式(reverse polish notation,也叫后缀表达式)可以利用进行求值。

  3. 二叉树包含k个结点时,链表中每个结点有两个孩子指针,共2k个,每个指针表示了一个父子关系。非空二叉树中除了跟结点外,每个结点都有唯一的父结点,因此2k个孩子指针中用k-1个表示了结点的父子关系,其余的k+1个孩子指针都为空指针

四、算法分析及常用算法

  1. 数据挖掘是一类深层次的数据分析。常见和应用最广泛的数据挖掘方法如下。
    决策树:决策树方法是利用信息论中的互信息(信息增益)寻找数据库中具有最大信息量的属性字段,建立决策树的一个结点,再根据该属性字段的不同取值建设树的分支;在每个分支子集中重复建立树的下层结点和分支的过程。国际上最早的、也是最有影响的决策树方法是Quiulan研究的ID3方法。
    神经网络:神经网络方法是模拟人脑神经元结构完成类似统计学中的判别、 回归、聚类等功能,是一种非线性的模型,主要有三种神经网络模型:前馈式网络、反馈式网络和自组织网络。人工神经网络最大的长处是可以自动地从数据中学习,形成知识,这些知识有些是我们过去未曾发现的,因此它具有较强的创新性。神经网络的知识体现在网络连接的权值上,神经网络的学习主要表现在神经网络权值的逐步计算上。
    遗传算法:遗传算法是模拟生物进化过程的算法,它由三个基本过程组成:繁殖(选择)、交叉(重组)、变异(突变)。采用遗传算法可以产生优良的后代,经过若干代的遗传,将得到满足要求的后代即问题得解。
    关联规则挖掘算法:关联规则是描述数据之间存在关系的规则,形式为 “A1A2…An=>B1B2…Bn”。一般分为两个步骤:求出大数据项集、用大数据项集产生关联规则。 除了上述的常用方法外,还有粗集方法,模糊集合方法,Bayesian Belief Netords ,最邻近算法(K-nearest Neighbors Method,kNN)等。

  2. 在应用散列函数构造哈希表(或散列表)时,由于设计散列函数的目标是:作为一个压缩映像函数,它应具有较大的压缩性,以节省存储空间;哈希函数应具有较好的散列性,虽然冲突是不可避免的,但应尽量减少。题中所给是常用的除留余数法,P值一般为不大于n且最接近n的质数。

  3. 装填因子a表示了哈希表的装满程度,显然,a越大发生冲突的可能性就越大。

  4. 分治法:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决;否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
    动态规划法:这种算法也用到了分治思想,它的做法是将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题。
    贪心算法:它是一种不追求最优解,只希望得到较为满意解的方法。贪心算法一般可以快速得到满意的解,因为它省去了为找到最优解而穷尽所有可能所必须耗费的大量时间。贪心算法常以当前情况为基础做最优选择,而不考虑各种可能的整体情况,所以贪心算法不要回溯。
    回溯算法(试探法):它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。其实现一般要用到递归和堆栈。eg.N-皇后方法
    针对单源最短路径问题,由Dijkstra这是一种典型的贪心策略,就是每递增一次,经对所有可能的源点、目标点的路径都要计算,得出最优。

  5. O记号:给出一个函数的渐进上界。给定一个函数g(n),0(g(n))表示为一个函数集合的{f(n): #在正常数c和no,使得对所有的n>no,有0≤f(n)≤cg(n)}
    在这里插入图片描述
    记号:给出一个函数的渐进下界。给定一个函数g(n),n(g(n))表示为一个函数集合{f(n):存在正常数c和no,使得对所有的n>no,有0≤cg(n)≤f(n)}
    在这里插入图片描述
    记号:给出一个函数的渐进上界和下界,即渐进确界。给定一个函数g(n),0(g(n)) 表示为一个函数集合{f(n):存在正常数C1、C2和n0,使得对所有的n≥n0,有n≥(0≤c1g(n)≤ f(n)≤c2g(n)}

五、线性结构

  1. 对于循环队列,
    队头元素的指针的计算公式为:(rear-len+1+M)%M
    队列中元素个数公式为:(rear-fear+M)%M。其中fear表示队列的对头指针。

  2. 字符串的模式匹配过程中,假设主串和模式串的长度分别为n和m,位置序号从0开始计算。
    设从主串的第i个位置开始与模式串匹配成功,在前i趟匹配中(位置0~i-1),每趟不成功的匹配都是模式串的第一个字符与主串中相应的字符不相同,则在前i趟匹配中,字符的比较共进行了i次,而第趟i=1(从位置i开始)成功匹配的字符比较次数为m,所以总的字符比较次数为 i+m (0 ≤i≤n-m)。
    而在最坏情况下,每一趟不成功的匹配都是模式串的最后一个字符与主串中相应的字符不相等,则主串中新一趟的起始位置为i-m+2。若设从主串的第f个字符开始匹配时成功,则前i趟不成功的匹配中,每趟都比较了m次,总共比较了i×m次,第i+1趟的成功匹配也比较了m次。因此,最坏情况下的比较次数为(n-m+1)*m。

  3. 字符串是由字符构成的序列,属于线性数据结构。包含任意个空格字符的字符串称为空白串。字符串中的字符取自特定的字符集合(常见的是ASCII字符集),其长度是指包含的字符个数

  4. 采用单向循环链表存储的特点之一是从表中任意结点出发都能遍历整个链表,另外便于元素的元素节点的删除与插入。如需要对表中的任意节点进行随机访问需采用顺序存储结构。

  5. 栈和队列都是操作受限的线性表:仅在表尾插入和删除元素队列仅在表头删除元素、在表尾插入元素
    采用单循环链表表示队列的示意图如下图所示:
    在这里插入图片描述入队时初始队列为空、出队后队列变为空要进行特殊处理。
    入队操作和出队操作均与队列长度无关,因此其时间复杂度都为O1.。
    队列是先入先出的线性表,栈是后进先出的线性表。一个线性序列经过队列结构后只能得到与原序列相同的元素序列,而经过一个栈结构后则可以得到多种元素序列。
    用两个栈可以模拟一个队列的入队和出队操作。

  6. 队列的元素按特点是先进先出。对于队列,元素的进入次序和出队的次序相同,例如,入队的序列为a、b、c,则出队的序列也为a、b、c。对于栈则不同,栈的运算特点是后进先出。若入栈序列为a、b、c,则出栈序列可能为a、b、c,a、c、b,b、a、c,b、c、a或者c、b、a,而c、a、b则不行,因此,
    入队序列与出队序列关系为1:1,
    而入栈序列与出栈序列关系是1:n(n≥1)。

  7. 在串比较、求子串、串连接、串替换运算中,除了串替换外,其他运算都不会改变串中的内容,因此,在链表存储方式下进行串替换最不方便

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值