python面试总结4(算法与内置数据结构)
算法与内置数据结构
- 常用算法和数据结构
- sorted
- dict/list/set/tuple
 
- 分析时间/空间复杂度
- 实现常见数据结构和算法
| 数据结构/算法 | 语言内置 | 内置库 | 
|---|---|---|
| 线性结构 | list(列表)/tuple(元祖) | array(数组,不常用)/collection.namedtuple | 
| 链式结构 | collections.deque(双端队列) | |
| 字典结构 | dict(字典) | collections.Counter(计数器)/OrderedDict(有序字典) | 
| 集合结构 | set(集合)/frozenset(不可变集合) | |
| 排序算法 | sorted | |
| 二分算法 | bisect模块 | |
| 堆算法 | heapq模块 | |
| 缓存算法 | functors.lru_cache(Least Recent Used,python3) | 
coolections模块提供了一些内置数据结构的扩展
collections
Point = collections.namedtuple('Point','x','y')
p = Point(1,2)
namedtuple让tuple属性可读
de = collections.deque()
de.append(1)
de.appendleft(0)
c = collections.Counter()
c = coolections.Counter('abcab')
python dict 底层结构
dict底层使用的哈希表
- 为了支持快速查找使用了哈希表作为底层结构
- 哈希表平均查找时间复杂度O(1)
- Cpython解释器使用二次探查解决哈希冲突问题
python list/tuple区别
- 都是线性结构 支持下标访问
- list是可变对象,tuple保存的引用不可变
t = ([1],2,3)
t[0].append(1)
t
([1,1],2,3)
保存的引用不可变指的是你没法替换掉这个对象,但是如果对系那个本身是一个可变对象,是可以修改这个引用指向的可变对象的
- list没发作为字典的key, tuple可以(可变对象不可hash)
什么是LRUCache?
Least-Recently-Used 替换掉最近最少使用的对象
- 缓存剔除策略,当缓存空间不够用的时候需要一种方式剔除key
- 常见的有LRU, LFU等
- LRU通过使用一个循环双端队列不断把最新访问的key放到表头实现
字典用来缓存,循环双端链表用来记录访问顺序
- 利用python内置的dict + collections.OrderedDict实现
- dict 用来当作k/v键值对的缓存
- OrderedDict用来实现更新最近访问的key
from collections import OrderedDict
class LRUCache:
  def __init__(self, capacity=128):
    self.od = OrderedDict()
    self.capacity = capacity
  def get(self, key): #每次访问更新最新使用的key
    if key in self.od:
      val = self.od[key]
      self.od.move_to_end(key)
      return val
    else:
      return -1
  def put(self, key, value): # 更新k/v
    if key in self.od:
      del self.od[key]
      self.od[key] = value # 更新key 到表头
    else:  # insert
      self.od[key] = value
      # 判断当前容量是否已经满了
      if len(self.od) > self.capacity:
        self.od.popitem(last=False)
      code/lrucache.py
算法常考点
排序+查找,重中之重
- 常考排序算法: 冒泡排序、快速排序、归并排序、堆排序
- 线性查找,二分查找等
- 能独立实现代码(手写), 能够分析时间空间复杂度
python web 后端常考数据结构
- 常见的数据结构链表、队列、栈、二叉树、堆
- 使用内置结构实现高级数据结构,比如内置的list/deque实现栈
- leetcode或者《剑指offer》上的常见题
常考数据结构之链表
链表有单链表、双链表、循环双链表
- 如何使用python 来表示链表结构
- 实现链表常见操作,比如插入节点,反转链表,合并多个链表等
- Leetcode练习常见链表题目
数据结构之链表
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
    pre = None
    cur = head
    while cur:
      nextnode = cur.next
      cur.next = pre
      pre = cur
      cur = nextnode
    ruture pre
数据结构之队列
队列(queue)是先进先出结构
- 如何使用python实现队列
- 实现队列的apend和pop操作,如何做到先做先出
- 使用python的list或者collections.deque实现队列
from collections import deque
class Queue:
   def __init__(self):
       self.items = deque()
   def append(self, val):
       retuen self.items.append(val)
   def pop(self):
       return self.items.popleft()
    def empty(self):
       return len(self.items) == 0
 def test_queue():
     q = Queue()
     q.append(0)
     q.append(1)
     q.append(2)
     print(q.pop())
     print(q.pop())
     print(q.pop())
 test_queue()()
0
1
2
常考数据结构之栈
栈(stack)是后进先出结构
- 如何使用python实现栈?
- 实现栈的push 和 pop 操作, 如何做到后进先出
- 同样可以用python list 或者collections.deque实现栈
from collections import deque
class Stack(object):
    def __init__(self):
        self.deque = deque() # 或者用list
    def push(self, value):
         self.deque.append(value)
    def pop(self):
         return self.deque.pop()
一个常考问题: 如何用两个栈实现队列?
常考数据结构之字典与集合
python dict/set 底层都是哈希表
- 哈希表的实现原理,底层其实就是一个数组
- 根据哈希函数快速定位一个元素,平均查找,非常快
- 不断加入元素会引起哈希表重新开辟空间,拷贝之前元素到新数组
python面试总结4(算法与内置数据结构)的更多相关文章
- Python的4个内置数据结构
		Python提供了4个内置数据结构(内置指可以直接使用,无需先导入),可以保存任何对象集合,分别是列表.元组.字典和集合. 一.列表有序的可变对象集合. 1.列表的创建例子 list1 = []lis ... 
- Python第五章-内置数据结构05-集合
		Python内置数据结构 五.集合(set) python 还提供了另外一种数据类型:set. set用于包含一组无序的不重复对象.所以set中的元素有点像dict的key.这是set与 list的最 ... 
- Python第五章-内置数据结构01-字符串
		Python 内置的数据结构  到目前为止,我们如果想保存一些数据,只能通过变量.但是如果遇到较多的数据要保存,这个时候时候用变量就变的不太现实.  我们需要能够保存大量数据的类似变量的东东,这种 ... 
- Python的内置数据结构
		Python内置数据结构一共有6类: 数字 字符串 列表 元组 字典 文件 一.数字 数字类型就没什么好说的了,大家自行理解 二.字符串 1.字符串的特性(重要): 序列化特性:字符串具有一个很重要的 ... 
- 【Redis源代码剖析】  -  Redis内置数据结构之压缩字典zipmap
		原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在 ... 
- python的四种内置数据结构
		对于每种编程语言一般都会规定一些容器来保存某些数据,就像java的集合和数组一样python也同样有这样的结构 而对于python他有四个这样的内置容器来存储数据,他们都是python语言的一部分可以 ... 
- Python内置数据结构--列表
		本节内容: 列表 元组 字符串 集合 字典 本节先介绍列表. 一.列表 一种容器类型.列表可以包含任何种类的对象,比如说数字.子串.嵌套其他列表.嵌套元组. 任意对象的有序集合,通过索引访问其中的元素 ... 
- python内置数据结构方法的时间复杂度
		转载自:http://www.orangecube.net/python-time-complexity 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了P ... 
- Python内置数据结构之元组tuple
		1. Python序列之元组:不可修改的序列 元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能像列表式的增删改,只能查,切片,所以元组又叫只读列表. 元组用圆括号括起(这是通常采用的做法) ... 
随机推荐
- matlab学习笔记10_2 一般操作符
			一起来学matlab-matlab学习笔记10 10_2一般操作符和数据显示格式 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德 ... 
- springboot使用SpringTask实现定时任务
			SpringTask是Spring自主研发的轻量级定时任务工具,相比于Quartz更加简单方便,且不需要引入其他依赖即可使用. 只需要在配置类中添加一个@EnableScheduling注解即可开启S ... 
- [LeetCode] 86. Partition List 划分链表
			Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ... 
- UE4 ios环境搭建备忘
			1.windows.mac安装证书 2.安装xcode .app -- 路径可以拖入 sudo gem install xcodeproj 3.错误处理 Setting up Mono Running ... 
- python爬虫2
			学习任务 获取去哪儿网的出发地列表 获取旅游景点列表 获取景点产品列表 存储数据 1 获取出发地站点 (1)访问touch.qunar.com (2)按F12,单击自由行,在自由行页面点击搜索框 (3 ... 
- 了解一下JVM和GC工作机制
			题外话:很久没有写博客了,事情颇多,今天空闲下来,学习一下顺便写一下自己的了解,机会总是留给有准备的人,所以平常一定要注意知识的巩固和积累.知识的深度也要有一定的理解,不比别人知道的多,公司干嘛选你? ... 
- [转载]机器学习&深度学习经典资料汇总,全到让人震惊
			自学成才秘籍!机器学习&深度学习经典资料汇总 转自:中国大数据: http://www.thebigdata.cn/JiShuBoKe/13299.html [日期:2015-01-27] 来 ... 
- 【vim小记】自动保存配置
			刚接触vim会发现有很多不习惯,其中,不能自动保存当前配置,每次退出要重新配置,很麻烦,好在vim早就为我们想到这些,在看手册的时候,发现里面有session, 这是用户手册的介绍: “会话保存所有 ... 
- 关于su下bash:xxx :command not found
			今天在新建组的时候出了问题: $ su Password: # groupadd prj bash: groupadd :command not found 我就纳闷,明明是在su权限下,怎么还不能使 ... 
- [转帖]ARM A77+G77最强公版架构:联发科5G SoC计划11月26日发布
			ARM A77+G77最强公版架构:联发科5G SoC计划11月26日发布 https://www.cnbeta.com/articles/tech/909025.htm 主流的手机SoC厂商已经纷纷 ... 
