面试知识点之算法数据结构
Posted 皮拉图斯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试知识点之算法数据结构相关的知识,希望对你有一定的参考价值。
算法与数据结构是计算机科学与技术的基础,本文主要梳理基本的算法和数据结构,它们是 IT 程序员面试必问的知识点,可以对照是否都掌握了.
简介
1.
简介
本文简单梳理了常见的数据结构及经典算法,对它们的特性做了简单的介绍,可以通过本文检查是否深刻的理解了这类知识及算法题型,其中排序、二叉树基本是面试必问的扫盲知识点.
1.1 数据结构
数组
链表(队列、栈)
字符串
二叉树(B/B+树、红黑树、平衡树)
哈希表
1.2 经典排序算法
简单排序: 选择、插入、冒泡
堆排序
归并排序
快速排序
外部排序: 二路合并排序、多路合并排序.
1.3 经典算法及实例
hash 算法
二分查找算法
贪心法
分治算法
回溯算法
动态规划
其它
1.4《剑指 offer 》
对于算法的准备,剑指 offer 是必备的,对于一般的面试算法题,剑指 offer 中题目的出现的十分高频. 笔试中若出现,最好能在 5 分钟内解出.
链表
二叉树
二叉搜索树
数组
字符串
栈
递归
回溯法
其他(约瑟夫环、滑动窗口等)
1.5 leetcode
leetcode 已经汇集了 1000 多道面试题,可以通过 leetcode 练习解题能力. 建议优先重点掌握高频的 100 道题 leetcode.com/problemset/top-100-liked-questions/ ,对于国内部分企业以及外企的面试将会是十分有帮助的.
数据结构
2.
数据结构
2.1 数组、链表与字符串
数组和链表都是计算机的基础结构. 对它的使用、内存结构都需要有深刻了解,因为它们将影响到程序的性能、安全、稳定性等各个方面.
数组: 数组的元素存储在一个连续的内存块中,数组中的元素通常是同类型的数据. 面试中,针对数组的考察常涉及二维数组、排序、首尾指针等经典的算法题型.
链表: 链表在内存中是非连续的、非顺序的存储结构,通过节点中的指针指向下一个位置. 针对链表则着重考察对结构的理解,题型常涉及翻转链表、链表公共交点、链表复制等.
字符串: 字符串在存储上类似与字符数组. 它是编程不可缺少的类型,也是面试中常考的题型,常常考察模式匹配、正则匹配等.
2.2 二叉树
二叉树是计算机中十分重要的结构,它的每个结点最多有俩个子树的结构,它与递归密切相关.
在面试、笔试中,也常通过二叉树考察编程能力. 常考题型包括镜像二叉树、二叉树中的路径、对称二叉树、二叉树遍历、二叉树高度、二叉树公共祖先等.
2.3 哈希表
在计算机中,哈希表是十分常用的,需要对哈希表的基础结构、冲突解决有基本的了解. 这样才能进一步了解底层, 比如 golang 的 map 实现、一致性哈希等.
此外,笔试算法题中也有许多借助 hash 表求解的.
算法
3.
算法
2.1 排序算法
排序算法是每个语言的基础,它被应用于各种基础的程序结构中. 虽然在开发过程中不需要过多的编写这些算法,但是基于它们的广泛应用,是十分有必要掌握它们的,包括实现、原理、时间复杂度、空间复杂度、稳定性. 下表是针 8 个经典的内部排序算法的特性总结:
序号 | 排序算法 |
时间复杂度 (最好、平均、最坏) |
空间复杂度 | 稳定性 |
应用场景 |
1 | 选择排序 |
O(n) O(n^2) O(n^2) |
O(1) |
不稳定 | 数据量少 |
2 | 插入排序 |
O(n) O(n^2) O(n^2) |
O(1) |
稳定 |
大部分已经排好序 |
3 | 冒泡排序 |
O(n) O(n^2) O(n^2) |
O(1) |
稳定 |
数据量小的简单场景 |
4 | 快速排序 |
O(n log2 n) O(n log2 n) O(n^2) |
O(log2 n)~O(n) | 不稳定 | 广泛应用 |
5 | 堆排序 |
O(n log2 n) O(n log2 n) O(n log2 n) |
O(1) | 不稳定 | 数据量大,找 TopK |
6 | 归并排序 | O(n log2 n) O(n log2 n) O(n log2 n) |
O(n) |
稳定 | 数据量大时的外部排序 |
7 | 希尔排序 |
O(n) O(n^1.3) O(n^2) |
O(1) |
不稳定 | 数量较少时 |
8 | 基数排序 |
O(d(r+n)) O(d(r+n)) O(d(r+n)) |
O(rd+n)) | 稳定 | 数值范围有限 |
2.2 经典算法解题方法
除了基础的排序算法,在一些手撕代码、笔试题中,需要掌握以下几类解题方法:
hash 算法: 借助 hash 表解题.
例题: Leetcode 146 LRU Cache
二分查找算法: 有序数列中查找的 log2 n 时间复杂度算法.
例题: Leetcode 74 Search a 2D Matrix
动态规划: 通过动态规划式子求解,它也是必须掌握的解题技巧.
例题: Leetcode 53 Maximum Subarray
贪心法: 迭代过程中总是选择当前看来最好的情况.
例题: Leetcode 455 Assign Cookies
深度优先、广度优先: 通过沿着分支纵向或者按层次依次遍历的方式寻求最优解.
例题: Leetcode 104 Maximum Depth of Binary Tree
例题: Leetcode 429 N-ary Tree Level Order Traversal
分治算法: 将问题分解成若干个小的问题,再进行求解.
例题: Leetcode 53 Maximum Subarray
回溯算法: 又称试探法,每一步都是试探性的,如果发现选择并不满足要求,则回退重新进行选择,并排除该路径.
例题: Leetcode 51 N-Queens
其它
END
4.
参考资料
4.1 九章算法 [https://zhuanlan.zhihu.com/p/32481454]
END
以上是关于面试知识点之算法数据结构的主要内容,如果未能解决你的问题,请参考以下文章