- 什么是数据结构?计算机存储、组织数据的方式。数据结构包括逻辑结构、物理结构和对数据的一系列操作。其中逻辑结构包括了线性结构(线性表、栈和队列)和非线性结构(树、图);物理结构包括顺序存储结构和链式存储结构。
- 解释顺序存储和链式存储:
- 顺序存储是在存储空间中开辟一块连续的存储空间进行存放数据,可以随机访问。链式存储的每一个结点需要存储当前的数据以及指向下一个数据的指针,可以利用任意的空间存储数据元素。
- 头指针和头结点
- 头指针是指向第一个结点存储位置的指针,具有标识作用,头指针是链表的必要元素,无论链表是否为空,头指针都存在。头节点:是放在第一个元素结点之前,便于在第一个元素节点之前进行插入和删除操作,头节点不是必要元素,头节点中的数据也不是必要的。
- 线性结构的特点:
- 必须存在唯一一个”第一个元素“,”最后一个元素“;除了最后元素都有后继...
- 数据和链表的区别:
- 1、逻辑结构数据长度固定;2、访问方式,数据可随机访问3、插入、删除的复杂度
- 栈和队列的区别:
- 栈的两个应用:
- 括号匹配;
- 当我们遇到左括号的时候将它压入栈中,遇到右括号需要弹出栈顶元素进行配对,若不匹配则非法...
- 将中缀表达式变成后缀表达式
- 后缀表达式的计算
- 1
- 中缀表达式变成后缀表达式
- 括号匹配;
- 字符串匹配算法
- 朴素模式匹配算法Omn:将主串中所有长度为m的子串(n-m+1)个依次与模式串对比,直到找到完全匹配的子串或所有的子串都不匹配为止。
- KMP算法On:当发生不匹配的情况的时候,主串的指针不移动,移动模式串的指针,利用模式串的NEXT数组来判断指针移动到那个地方,提高了工作效率
- 如何构造哈夫曼树:
- 将叶子节点按照权值大小从小到大排列,选取权值较小的两个作为二叉树的孩子节点,根节点的权值等于孩子节点的权值之和,将孩子节点从序列中删除,将根节点加入,循环知道形成唯一一个一个二叉树。
- 每个字符的二进制编码是从根节点到对应的叶子节点路径上的值拼接起来就是叶子节点字母应该的编码。
- 最小生成树(最小权重生成树):
- 普利姆算法;克鲁斯卡尔算法
- 最短路径算法:
- 迪杰斯特拉算法:单源最短路径,利用了动态规划;
- 弗洛伊德算法:任意两个节点之间的最短路径,采用贪心算法
- 介绍一下深度优先搜索和广度优先搜索算法:
- 介绍拓扑排序以及是如何实现的:
- 选择入度为0的节点,删除,以及与他相连的边。重复
- 各种查找方法:
- 查找包括静态查找和动态查找,其中静态查找包括:顺序查找、折半查找、分块查找;动态查找包括:二叉排序树树,平衡二叉树、B树、B+树的查找、红黑树
- 顺序查找:将待查找的元素放在第0位,从后往前把表中的元素与KEY比较,如果返回值为0则查找失败。如果返回值为元素的位置则查找成功。设置哨兵的位置是为了加快执行速度,时间复杂度为O(n),其特点是结构简单,对顺序结构和链式结构都适用。
- 折半查找:适用于有序的顺序表,设置low指针表中第一个元素,high指针指向最后一个元素,mid=(low+high)/2,比较key与mid值的大小,如果mid>key则设置low=mid+1;如果小于则设置high=mid-1;知道找到这个元素,或者low>high结束。
- 分块查找:将查找表分成不同的子表,要求每一个子表的元素都要比后面的子表的元素小,就是为了保证块间是有序的,块内可以无序,子表中最大的元素组成一个有序的索引表。当要查找一个元素的时候,首先比较索引表中的元素,确认它在哪一个子表中,然后在子表中顺序查找。
- 二叉排序树查找:从树的根节点开始,如果树比根节点大的话那么转向查找它的右子树,如果小的话,查找它的左子树。递归进行搜索。
- 哈希表的概念、构造方法、冲突的解决方法:
- 哈希表又称为散列表,是根据关键字的值直接访问的数据结构,即它通过把关键字的值映射到表中的一个位置,用来加快访问速度。其中映射函数又称为散列函数,存放记录的数组叫做散列表。哈希函数构造的方法:直接定址法、除留余数法、数字分析法、平方取中法。
- 解决哈希冲突的方法包括开放定址法,拉链法。
- 其中开放定址法:当发生冲突的时候,使用某种探测技术形成一个探测序列,然后沿着此序列逐个单元查找,直到碰到一个开放的地址为止。包括:线性探测、平方探测、双重散列法。
- 连接法:将所有的关键字为同义词的节点连接在同一个单链表中。类似图的邻接表表示法。
- 各种排序方法:
- 内部排序:插入排序、选择排序、交换排序、基数排序和归并排序
- 外部排序:归并排序
- 内部排序:
- 插入排序:直接插入排序、希尔排序
- 直接插入排序ON2:将待排序的元素直接插入前面已经有序的队列中。
- 希尔排序:选取间隔相同的元素为一个子表进行直接插入排序,然后缩小间隔,知道间隔为1.
- 交换排序:
- 冒泡排序ON2:从后向前扫描,把相邻的两个元素进行排序,直到整个序列有序。
- 快排:选取第一个元素为基准元素,然后设置low指针指向第二个元素,high指针指向最后一个元素,将low指针指到的大于基准元素的元素与high指针指到的小于基准元素的元素交换。直到low=high=null,将基准元素填入,形成左边比基准元素小的元素,右边比基准元素大的元素。在循环执行。
- 选择排序:
- 直接选择排序:选取元素中最大的元素放在序列最前面的位置。
- 堆排序:建立大根堆或者小根堆,然后输出堆顶元素,调整堆结构,直到输出了所有元素。
- 检查非终端节点调整堆的结构
- 算法效率分析:建堆,建堆的时间复杂度是ON,排序的时间复杂度是nlogn
- 基数排序:
- 归并排序:
- 把两个或者两个以上的有序表合并成新的有序表的过程。
- 插入排序:直接插入排序、希尔排序