Python内置数据结构算法常考

你使用过哪些常用内置算法和数据结构
 sorted
 dict/ist/set/tuple
 问题:想的不全或者压根没了解和使用过

常用内置数据结构和算法


第04章 Python算法与数据结构考察点

collections模块

有用过 collections 模块吗
collections模块提供了一些内置数据结构的扩展
第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点
第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点
第04章 Python算法与数据结构考察点
第04章 Python算法与数据结构考察点

Python dict底层结构

dict底层使用的哈希表
为了支持快速查找使用了哈希表作为底层结构
哈希表平均查找时间复杂度O(1)
 CPython解释器使用二次探查解决哈希冲突问题

哈希冲突和扩容是常考题

探查法

Python list/tuple区别

list vs tuple
都是线性结构,支持下标访问
list是可变对象, tuple保存的引用不可变
list没法作为字典的key, tuple可以(可变对象不可hash)



第04章 Python算法与数据结构考察点
保存的引用不可变指的是你没法替换掉这个对象,
但是如果对系那个本身是一个可变对象,是可以修改这个引用指向的可变对象的

什么是 LRUCache?

Least-Recently-Used替换掉最近最少使用的对象
缓存剔除策略,当缓存空间不够用的时候需要一种方式剔除key
常见的有LRU,LFU等
LRU通过使用一个循环双端队列不断把最新访问的key放到表头实现
第04章 Python算法与数据结构考察点

如何实现 LRUCache

字典用来缓存,循环双端链表用来记录访问顺序
利用 Python内置的dict+ collections.OrderedDict实现
dict用来当做k/v键值对的缓存
 OrderedDict用来实现更新最近访问的key

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

循环双端队列

Python算法常考题

算法常考点

排序+查找,重中之重
常考排序算法:冒泡排序、快速排序、归并排序、堆排序
线性查找,二分查找等
能独立实现代码(手写),能够分析时间空间复杂度

常用排序算法的时空复杂度


第04章 Python算法与数据结构考察点




Python数据结构常考题


Python web后端常考数据结构
◆常见的数据结构链表、队列、栈、二叉树、堆
◆使用内置结构实现高级数据结构,比如内置的    list/deque    实现栈
◆ Leetcode或者《剑指ofer》上的常见题

常考数据结构之链表

链表有单链表、双链表、循环双端链表
◆ 如何使用 Python来表示链表结构
◆ 实现链表常见操作,比如插入节点,反转链表,合并多个链表等
◆ Leetcode练习常见链表题目



第04章 Python算法与数据结构考察点
第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

常考数据结构之队列

队列(queue)是先进先出结构
◆如何使用 Python实现队列?
◆实现队列的 apend和pop操作,如何做到先进先出
◆使用 Python的list或者 collections.deque实现队列




第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

常考数据结构之栈

栈(stack)是后进先出结构
◆如何使用 Python实现栈?
◆实现栈的push和pop操作,如何做到后进先出
◆同样可以用 Python list或者 collections.deque 实现栈


第04章 Python算法与数据结构考察点
第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

常考数据结构之字典与集合

Python dict/set底层都是哈希表
哈希表的实现原理,底层其实就是一个数组
◆根据哈希函数快速定位一个元素,平均査找O(1),非常快
◆不断加入元素会引起哈希表重新开辟空间,拷贝之前元素到新数组

哈希表如何解决冲突

链接法和开放寻址法

◆元素key冲突之后使用一个链表填充相同key的元素
◆开放寻址法是冲突之后根据一种方式(二次探査)寻找下一个可用的槽
◆ Cpython使用的二次探查

二叉树

先序、中序、后序遍历
◆先(根)序:先处理根,之后是左子树,然后是右子树
◆中(根)序:先处理左子树,然后是跟,然后是右子树
◆后(根)序:先处理左子树,然后是右子树,最后是根


第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点

Python数据结构常考题之  堆

堆其实是完全二叉树,有最大堆和最小堆
最大堆:对于每个非叶子节点∨,V的值都比它的两个孩子大
◆最大堆支持每次pop操作获取最大的元素,最小堆获取最小元素
◆常见问题:用堆来完成topk问题,从海量数字中寻找最大的k个


第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点




什么是白板编程

传说中的手写算法题,白纸或者白板上手写代码
◆对于没有参加过ACM/蓝桥杯之类算法竞赛的同学比较吃亏
◆刷题。 LeetCode,《剑指 offer》,看 github题解
◆最近某大型互联网公司多年经验跳槽出来因为算法题面挂小公司

为啥要手写算法题

工作用不到,为啥还要考?
◆有些公司为了筛选编程能力强的同学,近年来对算法要求越来越高
◆针对刚出校门的同学问得多,有经验的反而算法考得少(偏工程经验)
◆竟争越来越激烈,大家水平差不多的优先选取有算法竞赛经验的

如何准备

没有太多好的方式,刷常见题。防止业务代码写多了算法手生
◆刷题, LeetCode常见题。看《剑指 offer》之类的面试算法书
◆面试之前系统整理之前做过的题目,不要靠记忆而是真正理解掌握
◆打好基础是重点,面试可以刷常见题突击,保持手感

面试前练习

刷题( leetcode+剑指 offer+看面经)
◆《剑指 offer》上常见题目用 Python实现
◆把 leetcode上常见分类题目刷一遍( github搜 leetcode分类)
◆常见排序算法和数据结构能手写
    快排,归并

不会怎么办

针对没有算法竞赛经验的同学
  • 有些公司是硬性标准,想要筛选参加过算法竞赛的同学
  • 问面试官这种题目工作中的使用场景,还是想仅仅刁难你
  • 如果不会可以一点一点和面试官交流,解释下自己这方面较薄弱



Python数据结构常考题之——链表

第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点




第04章 Python算法与数据结构考察点










链表

链表涉及到指针操作较为复杂,容易出错,经常用作考题
熟悉链表的定义和常见操作
常考题:删除一个链表节点
常考题:合并两个有序链表



多写多练

找到相关的题目,多做一些练习
一般可能一次很难写对
尝试自己先思考,先按照自己的方式编写代码,提交后发现问题
如果实在没有思路或者想参考别人的思路可以搜题解



Python数据结构常考题之二叉树

二叉树
二叉树涉及到递归和指针操作,常结合递归考察
二叉树的操作很多可以用递归的方式解决,不了解递归会比较吃力
常考题:二叉树的镜像
常考题:如何层序遍历二叉树(广度优先)
第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点






第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点



第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点



数据结构之堆

堆的常考题基本围绕在合并多个有序(数组/链表);TopK问题
理解堆的概念,堆是完全二叉树,有最大堆和最小堆
会使用 Python内置的 heapq模块实现堆的操作
常考题:合并k个有序链表 leetcode merge-k- sorted-ist


第04章 Python算法与数据结构考察点


第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点


Python字符串常考算法题

字符串题

了解常用的字符串操作
 Python内置了很多字符串操作,比如 split, upper, replace等
常考题:翻转一个字符串
常考题:判断一个数字是否是回文数

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点

第04章 Python算法与数据结构考察点
第04章 Python算法与数据结构考察点



反转链表

链表在面试中是一个高频考点( leetcode reverse-linked-list)
如何反转一个单链表?
你能使用循环的方式实现吗?
能否用递归的方式实现?

相关文章: