技术面试宝典: 很全面的算法和数据结构知识(含代码实现)

目录

  • 在线练习
  • 在线编程面试
  • 数据结构
  • 算法
  • 贪心算法
  • 位运算
  • 复杂度分析
  • 视频教程
  • 面试宝典
  • 计算机科学资讯
  • 文件结构

在线练习

在线编程面试

数据结构

链表

  • 链表是一种由节点(Node)组成的线性数据集合,每个节点通过指针指向下一个节点。它是一种由节点组成,并能用于表示序列的数据结构。
  • 单链表:每个节点仅指向下一个节点,最后一个节点指向空(null)。
  • 双链表:每个节点有两个指针p,n。p指向前一个节点,n指向下一个节点;最后一个节点指向空。
  • 循环链表:每个节点指向下一个节点,最后一个节点指向第一个节点。
  • 时间复杂度:
    • 索引:O(n)
    • 查找:O(n)
    • 插入:O(1)
    • 删除:O(1)

  • 栈是一个元素集合,支持两个基本操作:push用于将元素压入栈,pop用于删除栈顶元素。
  • 后进先出的数据结构(Last In First Out, LIFO)
  • 时间复杂度
    • 索引:O(n)
    • 查找:O(n)
    • 插入:O(1)
    • 删除:O(1)

队列

  • 队列是一个元素集合,支持两种基本操作:enqueue 用于添加一个元素到队列,dequeue 用于删除队列中的一个元素。
  • 先进先出的数据结构(First In First Out, FIFO)。
  • 时间复杂度
    • 索引:O(n)
    • 查找:O(n)
    • 插入:O(1)
    • 删除:O(1)

  • 树是无向、联通的无环图。

二叉树

  • 二叉树是一个树形数据结构,每个节点最多可以有两个子节点,称为左子节点和右子节点。
  • 满二叉树(Full Tree):二叉树中的每个节点有 0 或者 2 个子节点。
  • 完美二叉树(Perfect Binary):二叉树中的每个节点有两个子节点,并且所有的叶子节点的深度是一样的。
  • 完全二叉树:二叉树中除最后一层外其他各层的节点数均达到最大值,最后一层的节点都连续集中在最左边。

二叉查找树

  • 二叉查找树(BST)是一种二叉树。其任何节点的值都大于等于左子树中的值,小于等于右子树中的值。
  • 时间复杂度
    • 索引:O(log(n))
    • 查找:O(log(n))
    • 插入:O(log(n))
    • 删除:O(log(n))

6941baebly1fehl7rmxs8j20od15ojuu.jpg

字典树

  • 字典树,又称为基数树或前缀树,是一种用于存储键值为字符串的动态集合或关联数组的查找树。树中的节点并不直接存储关联键值,而是该节点在树中的位置决定了其关联键值。一个节点的所有子节点都有相同的前缀,根节点则是空字符串。

6941baebly1fehl7r4nzfj20e80dcgmq.jpg

树状数组

  • 树状数组,又称为二进制索引树(Binary Indexed Tree,BIT),其概念上是树,但以数组实现。数组中的下标代表树中的节点,每个节点的父节点或子节点的下标可以通过位运算获得。数组中的每个元素都包含了预计算的区间值之和,在整个树更新的过程中,这些计算的值也同样会被更新。
  • 时间复杂度
    • 区间求和:O(log(n))
    • 更新:O(log(n))

6941baebly1fehl7qs479j20hl0dcjuy.jpg

线段树

  • 线段树是用于存储区间和线段的树形数据结构。它允许查找一个节点在若干条线段中出现的次数。
  • 时间复杂度
    • 区间查找:O(log(n))
    • 更新:O(log(n))

6941baebly1fehl7q5vwvj20hs0cdq4n.jpg

  • 堆是一种基于树的满足某些特性的数据结构:整个堆中的所有父子节点的键值都满足相同的排序条件。堆分为最大堆和最小堆。在最大堆中,父节点的键值永远大于等于所有子节点的键值,根节点的键值是最大的。最小堆中,父节点的键值永远小于等于所有子节点的键值,根节点的键值是最小的。
  • 时间复杂度
    • 索引:O(log(n))
    • 查找:O(log(n))
    • 插入:O(log(n))
    • 删除:O(log(n))
    • 删除最大值/最小值:O(1)

6941baebly1fehl7pkqxxj20p00w2ju4.jpg

哈希

  • 哈希用于将任意长度的数据映射到固定长度的数据。哈希函数的返回值被称为哈希值、哈希码或者哈希。如果不同的主键得到相同的哈希值,则发生了冲突。
  • Hash Maphash map 是一个存储键值间关系的数据结构。HashMap 通过哈希函数将键转化为桶或者槽中的下标,从而便于指定值的查找。
  • 冲突解决
    • 链地址法(Separate Chaining:在链地址法中,每个桶(bucket)是相互独立的,每一个索引对应一个元素列表。处理HashMap 的时间就是查找桶的时间(常量)与遍历列表元素的时间之和。
    • 开放地址法(Open Addressing:在开放地址方法中,当插入新值时,会判断该值对应的哈希桶是否存在,如果存在则根据某种算法依次选择下一个可能的位置,直到找到一个未被占用的地址。开放地址即某个元素的位置并不永远由其哈希值决定。

6941baebly1fehl7oz319j20fd0dc402.jpg

  • 图是G =(V,E)的有序对,其包括顶点或节点的集合 V 以及边或弧的集合E,其中E包括了两个来自V的元素(即边与两个顶点相关联 ,并且该关联为这两个顶点的无序对)。
  • 无向图:图的邻接矩阵是对称的,因此如果存在节点 u 到节点 v 的边,那节点 v 到节点 u 的边也一定存在。
  • 有向图:图的邻接矩阵不是对称的。因此如果存在节点 u 到节点 v 的边并不意味着一定存在节点 v 到节点 u 的边。

6941baebly1fehl7og3jej20p0133goj.jpg

算法

排序

快速排序

  • 稳定:否
  • 时间复杂度
    • 最优:O(nlog(n))
    • 最差:O(n^2)
    • 平均:O(nlog(n))

6941baebly1fehl7nu4z7g20r107jqnp.gif

合并排序

  • 合并排序是一种分治算法。这个算法不断地将一个数组分为两部分,分别对左子数组和右子数组排序,然后将两个数组合并为新的有序数组。
  • 稳定:是
  • 时间复杂度:
    • 最优:O(nlog(n))
    • 最差:O(nlog(n))
    • 平均:O(nlog(n))

6941baebly1fehl7icnjzg20hs0aokjn.gif

桶排序

  • 桶排序是一种将元素分到一定数量的桶中的排序算法。每个桶内部采用其他算法排序,或递归调用桶排序。
  • 时间复杂度
    • 最优:Ω(n + k)
    • 最差: O(n^2)
    • 平均:Θ(n + k)

6941baebly1fehl7k0qx4j20hs07k75q.jpg

基数排序

  • 基数排序类似于桶排序,将元素分发到一定数目的桶中。不同的是,基数排序在分割元素之后没有让每个桶单独进行排序,而是直接做了合并操作。
  • 时间复杂度
    • 最优:Ω(nk)
    • 最差: O(nk)
    • 平均:Θ(nk)

图算法

深度优先搜索

  • 深度优先搜索是一种先遍历子节点而不回溯的图遍历算法。
  • 时间复杂度:O(|V| + |E|)

6941baebly1fehl7jf9xtg20hs09974o.gif

广度优先搜索

  • 广度优先搜索是一种先遍历邻居节点而不是子节点的图遍历算法。
  • 时间复杂度:O(|V| + |E|)

6941baebly1fehl7iwu8hg20hs09974o.gif

拓扑排序

  • 拓扑排序是有向图节点的线性排序。对于任何一条节点 u 到节点 v 的边,u 的下标先于 v。
  • 时间复杂度:O(|V| + |E|)

Dijkstra算法

  • Dijkstra 算法是一种在有向图中查找单源最短路径的算法。
  • 时间复杂度:O(|V|^2)

6941baebly1fehl77perwg20li09atbg.gif

Bellman-Ford算法

  • Bellman-Ford 是一种在带权图中查找单一源点到其他节点最短路径的算法。
  • 虽然时间复杂度大于 Dijkstra 算法,但它可以处理包含了负值边的图。
  • 时间复杂度:
    • 最优:O(|E|)
    • 最差:O(|V||E|)

6941baebly1fehl771hlsg20kr079438.gif

Floyd-Warshall 算法

  • Floyd-Warshall 算法是一种在无环带权图中寻找任意节点间最短路径的算法。
  • 该算法执行一次即可找到所有节点间的最短路径(路径权重和)。
  • 时间复杂度:
    • 最优:O(|V|^3)
    • 最差:O(|V|^3)
    • 平均:O(|V|^3)

最小生成树算法

  • 最小生成树算法是一种在无向带权图中查找最小生成树的贪心算法。换言之,最小生成树算法能在一个图中找到连接所有节点的边的最小子集。
  • 时间复杂度:O(|V|^2)

6941baebly1fehl76ellbg208q08zago.gif

Kruskal 算法

  • Kruskal 算法也是一个计算最小生成树的贪心算法,但在 Kruskal 算法中,图不一定是连通的。
  • 时间复杂度:O(|E|log|V|)

6941baebly1fehl75byw0g208q08zgwv.gif

贪心算法

  • 贪心算法总是做出在当前看来最优的选择,并希望最后整体也是最优的。
  • 使用贪心算法可以解决的问题必须具有如下两种特性:
    • 最优子结构
      • 问题的最优解包含其子问题的最优解。
    • 贪心选择
      • 每一步的贪心选择可以得到问题的整体最优解。
  • 实例-硬币选择问题
  • 给定期望的硬币总和为 V 分,以及 n 种硬币,即类型是 i 的硬币共有 coinValue[i] 分,i的范围是 [0…n – 1]。假设每种类型的硬币都有无限个,求解为使和为 V 分最少需要多少硬币?
  • 硬币:便士(1美分),镍(5美分),一角(10美分),四分之一(25美分)。
  • 假设总和 V 为41,。我们可以使用贪心算法查找小于或者等于 V 的面值最大的硬币,然后从 V 中减掉该硬币的值,如此重复进行。
    • V = 41 | 使用了0个硬币
    • V = 16 | 使用了1个硬币(41 – 25 = 16)
    • V = 6 | 使用了2个硬币(16 – 10 = 6)
    • V = 1 | 使用了3个硬币(6 – 5 = 1)
    • V = 0 | 使用了4个硬币(1 – 1 = 0)

运算

  • 位运算即在比特级别进行操作的技术。使用位运算技术可以带来更快的运行速度与更小的内存使用。
  • 测试第 k 位:s & (1 << k);
  • 设置第k位:s |= (1 << k);
  • 关闭第k位:s &= ~(1 << k);
  • 切换第k位:s ^= (1 << k);
  • 乘以2n:s << n;
  • 除以2n:s >> n;
  • 交集:s & t;
  • 并集:s | t;
  • 减法:s & ~t;
  • 提取最小非0位:s & (-s);
  • 提取最小0位:~s & (s + 1);
  • 交换值:x ^= y; y ^= x; x ^= y;

运行时分析

大 O 表示

  • 大 O 表示用于表示某个算法的上界,用于描述最坏的情况。

6941baebly1fehl74ftayj20hs0dc0sn.jpg

小 O 表示

  • 小 O 表示用于描述某个算法的渐进上界,二者逐渐趋近。

大 Ω 表示

  • 大 Ω 表示用于描述某个算法的渐进下界。

6941baebly1fehl7409jrj20hs0dcjr9.jpg

小 ω 表示

  • 小 ω 表示用于描述某个算法的渐进下界,二者逐渐趋近。

Theta Θ 表示

  • Theta Θ 表示用于描述某个算法的确界,包括最小上界和最大下界。

6941baebly1fehl73k2kmj20hs0dc3yg.jpg

以为这就结束了?No, 这些知识不仅仅是停留在理论,还有代码实现。

 

63918611gy1feq19n1ig5j20br24bn79.jpg

这其实是来自 GitHub 的一个 repo:https://github.com/kdn251/interviews

除了上述算法和数据结知识外,其中还有推荐了一些算法练习网站、视频教程、面试宝典、Google、Facebook 等知名公司面试题及解答代码。下载实例代码或者收藏练习网站。

Enjoy!

转载于:https://my.oschina.net/u/2822116/blog/887740

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 最近越来越多的公司开始关注AI和大数据,这也就导致了Python这门编程语言的热门程度不断攀升。随着Python的普及,与之相关的面试也愈加激烈。如果你想在面试中脱颖而出,那你需要了解一些基础的Python面试题。 而《面试宝典:深入理解这110道Python面试题》正是一本非常好的参考书籍。该书包了各种类型的面试题,涵盖了python的基础、数据结构算法、面向对象编程、函数式编程、并发编程、Web开发、网络编程、AI、大数据等方面的知识。 本书的优点不仅仅局限于提供面试题目,更重要的是它会详细的分析每个题目的解决思路,还会对每个解决方案给出相应的优缺点和应用场景。同时这些面试题也是由不同公司的面试官精选,保证了题目的多样性和适用性。 Python已经成为了AI和大数据领域的主力语言。掌握Python面试题所需要的知识对于程序员来说是非常有利的,因为通过这些题目的掌握,可以加强自己对Python的基础和应用,也可以让自己更好地应对面试。参考这本书,不仅可以帮助你更好地备战Python面试,更可以为你在AI和大数据领域提供必要的技能支持。 ### 回答2: Python是当今世界上最为流行的编程语言之一,它具有易学、易用、高效、可移植等优点,在人工智能和大数据领域尤为广泛应用。因此,掌握Python编程语言是未来求职市场竞争的必备技能。而《面试宝典:深入理解这110道python面试题,ai和大数据向你招手》则是为Python程序员所准备的面试参考资料。 这本书针对Python的AI和大数据领域所涉及的知识点,包括但不仅限于基础语法、面向对象、函数式编程、IO流操作、多线程编程、内存管理、网络编程、数据库操作等方面,针对面试官常问的问题进行深入解析,给出详细的解答,涉及的面试题目覆盖了各个职位级别和不同难度的面试题。无论是初学者还是有经验的开发者,都可以从中收获很多。 了解以上面试科目的本质和规律,能够帮助我们抓住核心概念,快速准确的把握题意,并给出优秀的回答方案。基于此,读完这本书不仅能够帮助我们顺利通过Python相关的面试,还能够提高我们的技能水平,更好地开展工作。 ### 回答3: 最近,随着人工智能和大数据的兴起,很多公司开始倾向于雇用Python技术人员。如果你有一定的Python编程经验并在寻找新的工作机会,那么你需要对一些基本的Python面试题进行深入理解,这些问题涉及Python的许多不同方面,包括语言特性,数据结构算法和库等。 《面试宝典:深入理解这110道Python面试题》是一本非常好的教材,它包括了面试中常被问到的Python基础知识以及Python在人工智能和大数据中的应用。通过研读这本书,你可以更好地了解Python的基本概念,理解Python的工作原理,并且了解如何在Python中编写高效的代码。 本书内容具有良好实用性,你将会学习到如何使用Python构建各种不同类型的数据结构算法,并深入了解Python常用的库、算法和数据分析技术。这些知识将有助于你在Python开发时设计更为复杂而高效的应用,提高自己在Python职业中的水平和竞争力。 总之,如果你正在寻找一份Python编程相关的工作,那么你需要认真研读《面试宝典:深入理解这110道Python面试题》这本书,它将有助于您更好地准备Python职业面试并获得您理想的工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值