算法与内置数据结构

  • 常用算法和数据结构

    1. sorted
    2. 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(算法与内置数据结构)的更多相关文章

  1. Python的4个内置数据结构

    Python提供了4个内置数据结构(内置指可以直接使用,无需先导入),可以保存任何对象集合,分别是列表.元组.字典和集合. 一.列表有序的可变对象集合. 1.列表的创建例子 list1 = []lis ...

  2. Python第五章-内置数据结构05-集合

    Python内置数据结构 五.集合(set) python 还提供了另外一种数据类型:set. set用于包含一组无序的不重复对象.所以set中的元素有点像dict的key.这是set与 list的最 ...

  3. Python第五章-内置数据结构01-字符串

    Python 内置的数据结构 ​ 到目前为止,我们如果想保存一些数据,只能通过变量.但是如果遇到较多的数据要保存,这个时候时候用变量就变的不太现实. ​ 我们需要能够保存大量数据的类似变量的东东,这种 ...

  4. Python的内置数据结构

    Python内置数据结构一共有6类: 数字 字符串 列表 元组 字典 文件 一.数字 数字类型就没什么好说的了,大家自行理解 二.字符串 1.字符串的特性(重要): 序列化特性:字符串具有一个很重要的 ...

  5. 【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在 ...

  6. python的四种内置数据结构

    对于每种编程语言一般都会规定一些容器来保存某些数据,就像java的集合和数组一样python也同样有这样的结构 而对于python他有四个这样的内置容器来存储数据,他们都是python语言的一部分可以 ...

  7. Python内置数据结构--列表

    本节内容: 列表 元组 字符串 集合 字典 本节先介绍列表. 一.列表 一种容器类型.列表可以包含任何种类的对象,比如说数字.子串.嵌套其他列表.嵌套元组. 任意对象的有序集合,通过索引访问其中的元素 ...

  8. python内置数据结构方法的时间复杂度

    转载自:http://www.orangecube.net/python-time-complexity 本文翻译自Python Wiki 本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了P ...

  9. Python内置数据结构之元组tuple

    1. Python序列之元组:不可修改的序列 元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能像列表式的增删改,只能查,切片,所以元组又叫只读列表. 元组用圆括号括起(这是通常采用的做法) ...

随机推荐

  1. jdk1.7 64位官方下载

    平时要新装一个系统环境,或者下载最新的jdk,就需要到oracle官网去下载一个jdk,而目前生产环境都是1.7的环境下开发完成的,需要下载1.7版本的jdk,oracle官方网站的默认下载页面是1. ...

  2. 非LODOP的打印其他问题-简短问答

    该文是一些应用软件,或打印机,即使不使用lodop,也可能会常见的问题.一般和操作系统,电脑硬件打印机硬件等有关. 1.错误-正在打印 怎么解决这个是打印机队列的状态,排查下电脑和打印机的连线是否正常 ...

  3. 使用Termux,在手机上做nodejs编程,运行nodejs程序。

    如果你是一名nodejs开发者,是否想过以下问题:在手机上运行nodejs程序?用手机当nodejs服务器?在手机上做nodejs编程?YES!使用Termux,以上都可以做到! 下面展示如何实现这个 ...

  4. 【Linux开发】【CUDA开发】Ubuntu上安装NVIDIA显卡驱动

    机型为戴尔Vostro3900  显卡型号为GTX 745  对于Nvidia显卡的驱动,如今很多Linux发行版会默认使用名为nouveau的驱动程序.Nouveau是由第三方为Nvidia开发的一 ...

  5. [计算机视觉][神经网络与深度学习]Faster R-CNN配置及其训练教程2

    faster-rcnn分为matlab版本和python版本,首先记录弄python版本的环境搭建过程.matlab版本见另一篇:faster-rcnn(testing): ubuntu14.04+c ...

  6. OpenJudge 2755:神奇的口袋

    总时间限制: 10000ms 内存限制: 65536kB 描述 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体 ...

  7. 大型web项目构建之负载均衡

    日常开发和学习中经常会听到或者会看到“负载均衡”这个词汇,但是对于很多初级每天只面对增删改代码的开发人员来说,这个词汇好像离我们很遥远又很接近,很多人多多少少都有点一知半解 我结合以前在开发中遇到的场 ...

  8. python基础 — Selenium 详细介绍

    一.Selenium+Python环境搭建及配置 1.1 selenium 介绍 selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium ,因为它相比 ...

  9. Linux命令xargs的使用

    ls | xargs catls | xargs -I {} cat {}  大写I,指定参数的替换符号为{} 自定义

  10. Spring MVC传输对象属性

    今天搬砖时遇到一个问题,前端使用JSP+form传输数据,后台使用Spring MVC接收,但是接收到的对象属性一直是null,找了好久才发现原因,代码如下 前端代码   后端代码   需要注意一点 ...