面试知识点之算法数据结构

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






以上是关于面试知识点之算法数据结构的主要内容,如果未能解决你的问题,请参考以下文章

Java面试题之扫盲知识点整理

数据结构与算法读书会之算法复杂度必考知识点

前端劝退之前端知识体系(前端面试体系)

Android 面试之开源库分析

Android 面试之开源库分析

数据挖掘面试题之梯度提升树