数据结构与算法2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/slh2016/article/details/84593161

数据结构与算法常见基础问题总结

  1. 什么是数据结构?
    数据结构是指相互之间存在一种或多种特定关系的数据结构集合。即数据和数据之间的关系。
  2. 数据的存储结构是怎样的?
    分为顺序存储和链式存储。
    顺序存储类似食堂打饭排队,中间加塞需要后面的人全部后移;
    链式存储类似银行取号机制排队办理业务,依靠号码进行排队,加塞只需给个最小号-1就可以。
  3. 数据的逻辑结构是什么?
    分为线性结构、树形结构、集合(哈希表)结构、图形结构四种。
    线性结构中元素的关系为一对一的关系;
    树形结构中元素的关系为一对多的关系;
    集合结构中元素同属于一个集合,为并列关系;
    图形结构中元素的关系为多对多的关系;
  4. 什么是算法?
    算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述算法问题的策略机制。
    简而言之,算法就是解决问题的思路。
  5. 算法有什么特性?
    算法有5个特性,分别是输入、输出、有穷性、确定性、可行性。
  6. 算法有什么要求?
    算法的要求有5个方面,分别是正确性、可读性、健壮性、时间复杂度、空间复杂度。
  7. 如何衡量算法的优劣?
    衡量算法一般有事后统计和事前分析估算的方法。
  8. 线性结构有哪些?
    线性结构一般有一维数组、栈、队列、链表等结构。
  9. 数组的查找算法有哪些?
    数组查找可以通过线性查找法(逐个遍历)和二分查找法(前提是有序)进行查找匹配。
  10. 栈与队列的区别是什么?
    栈是一种先进后出的数据结构,类似手枪子弹上弹夹,先放进去的子弹最后被打出来;
    队列是一种先进先出的数据结构,类似于银行办理业务排队,先排队的先办理业务。
  11. 链表都有哪些,他们的数据结构是什么样的?
    链表有单向链表、单向循环链表、双向链表和双向循环链表四种。
    单向链表的数据结构是节点内容+下一个节点引用的结构;最后一个节点的下一个节点为NULL;
    单向循环链表与单向链表的区别是单向循环链表的最后一个节点的下一个节点指向第一个节点;
    双向链表(非循环)的数据结构是上一个节点引用+节点的内容+下一个节点引用的结构,最后一个节点的下一个节点为null,第一个节点的上一个节点为null;
    双向循环链表与双向链表的区别是最后一个节点的下一个节点指向第一个节点,第一个节点的上一个节点指向最后一个节点。
  12. 什么是递归?
    递归是在一个方法内部调用该方法本身的编程方式。
  13. 什么是树结构?
    树结构是一种非线性数据结构,它的数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树。
  14. 树结构有哪些?
    树结构有二叉树、线索二叉树、赫夫曼树、二叉排序树、二叉平衡树和多路查找树等树结构。
  15. 什么是满二叉树,什么是完全二叉树?
    满二叉树中,所有叶子节点都在最后一层且节点的总数为(2^n-1)个,n为树的高度。
    完全二叉树中,所有叶子节点都在最后一层或者倒数第二层且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续(若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树 );
  16. 链式存储的二叉树和顺序存储的二叉树有什么区别?
    链式存储是使用链表关联引用存储;
    顺序存储的二叉树存储数据在数组中,从第一层开始从左到右依次填入数组中,顺序存储的二叉树通常只存储完全二叉树(即数组中间不会有空值)。
  17. 树的遍历有几种方式?
    遍历分为前序遍历、中序遍历、后序遍历三种。
    前序遍历:针对所有的节点,遍历顺序为父节点->左节点->右节点;
    中序遍历:针对所有的节点,遍历顺序为左节点->父节点->右节点;
    后序遍历:针对所有的节点,遍历顺序为左节点->右节点->父节点;
  18. 什么是线索二叉树?
    利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索"),加上线索的二叉树称为线索二叉树。
  19. 线索二叉树解决了什么问题?
    线索链表解决了无法直接找到该结点在某种遍历序列中的前驱和后继结点的问题,解决了二叉链表找左、右孩子困难的问题。
    二叉树的遍历本质上是将一个复杂的非线性结构转换为线性结构,使每个结点都有了唯一前驱和后继(第一个结点无前驱,最后一个结点无后继)。对于二叉树的一个结点,查找其左右子女是方便的,其前驱后继只有在遍历中得到。为了容易找到前驱和后继,调整二叉树节点数据结构来很方便的找到其前驱后继节点。
  20. 什么是赫夫曼树?
    给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。
  21. 赫夫曼树有什么特点?
    哈夫曼树的构建方式为子下而上开始构建,权值较大的结点离根较近。
  22. 赫夫曼树结构在实际中有什么应用?
    数据压缩,依据数据的出现频率进行编码,出现频率越高,编码越短,且所有编码不会出现部分重复导致混淆,最终实现缩短整体编码的目标。
  23. 什么是二叉排序树?
    二叉排序树又称二叉查找树、二叉搜索树,左子树的最大值小于根节点,右子树的最小值大于根节点,且没有键值相等的节点称为二叉排序树。
  24. 什么是二叉平衡树?
    它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
  25. 插入数据时如何始终保持二叉平衡树始终保持平衡?
    通过单旋和双旋的方式。
  26. 什么是多路查找树?
    多路就是子树超过2个的树,B树和B+树是多路查找树。
  27. B树与B+树的区别是什么?
    单一节点存储更多的元素,使得查询的IO次数更少
    所有查询都要查找到叶子节点,查询性能稳定
    所有叶子节点形成有序链表,便于范围查询
  28. 什么是哈希表(散列表,集合结构)数据结构?
    哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。
    如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值
  29. 什么是Hash函数?
    建立起数据元素的存放位置与数据元素的关键字之间的对应关系的函数被称为哈希函数。
  30. 有哪些哈希表的构造方法?
    有直接定址法、数字分析法、平方取中法、取余法、随机数法。
  31. 如何使用Hash表结构?
    存储数据时,将数据存入通过哈希函数计算所得哪那个地址里面。
    查找时,使用同一个哈希函数通过关键字key计算出存储地址,通过该地址即可访问到查找的记录。
  32. Hash函数有什么要求?
    哈希函数需要易于计算并且能够均匀分布所有键。
  33. 如何解决散列冲突问题?
    可以通过开放地址法和链地址法处理,开放地址法包括线性探测法、二次探测法、再哈希法。
  34. 什么是图结构?
    结点之间的邻接关系是任意的一种数据结构。
  35. 图结构的遍历方式有几种?
    有深度优先遍历和广度优先遍历两种。
  36. 列举常用的排序算法
    常用的排序算法有交换排序(冒泡排序和快速排序)、插入排序(直接插入排序和希尔排序)、选择排序(简单选择排序和堆排序)、归并排序和基数排序。
  37. 简述冒泡排序和快速排序的原理
    冒泡排序是比较两个相邻的元素,将值大的元素交换到右端。
    快速排序(Quicksort)是对冒泡排序的一种改进。首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
  38. 简述直接插入排序和希尔排序的原理
    直接插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。一般是把第一个元素看作是一个有序的序列,不断地将待排序记录插入到有序序列中,最后整个序列都是一个有序序列。
    希尔排序是直接插入排序的改进版,又称缩小增量排序,其原理是将序列按照一定步长(间隔)分为若干个子序列,然后对每一个子序列进行简单插入排序,排序之后缩短步长再次进行子序列排序,最终步长为1进行简单插入排序,整个的排序过程每一个元素会不断接近它最终的位置。
  39. 简述简单选择排序和堆排序的原理
    简单选择排序是每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。
    堆排序就是将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。大顶堆:每个节点都大于等于左右孩子节点的值,小顶堆:每个节点都小于等于左右孩子节点的值。
  40. 简述归并排序的原理
    归并排序是将两个有序序列归并为一个有序序列的过程,对于一个序列,可以通过递归不断拆分成两个更小的序列,最终拆到长度为0或者1的两个序列,然后两两归并,最后整个序列有序。
  41. 简述基数排序的原理
    基数排序是将整数按位数切割成不同的数字,然后按每个位数分别比较,比如至多三位数的整数,先按照各位大小进行排序,再按照十位大小进行排序,最后按照百位进行排序,最终成为有序序列,不足三位补零,前提是必须知道序列中最大的数才能使用基数排序。

猜你喜欢

转载自blog.csdn.net/slh2016/article/details/84593161