python数据结构
闲云野鹤01
沟通邮箱xiaosongcsdn@163.com
展开
-
抽象数据类型和面向对象编程
类主要是由数据、操作组成ADT:abstract Data Type(抽象胡数据类型)# coding: utf8class Bag(object): def __init__(self,maxsize=10): #初始化函数 self.maxsize = maxsize #最大容量 self._items = list() ...原创 2019-09-24 17:09:05 · 393 阅读 · 0 评论 -
基本排序算法
冒泡排序bubble sort 可以说是最简单的一种排序算法了,它的思想如下。对一个数组进行 n-1 轮迭代,每次比较相邻两个元素, 如果相邻的元素前者大于后者,就交换它们。因为直接在元素上操作而不是返回新的数组,所以是一个 inplace 的操作。 这里冒泡的意思其实就是每一轮冒泡一个最大的元素就会通过不断比较和交换相邻元素使它转移到最右边。你可以想象假如有 10 个小盆友从左到右站成一...原创 2019-09-26 18:53:53 · 102 阅读 · 0 评论 -
二分查找
假如一个序列已经有序了呢,我们还需要从头找到尾吗?当然不用,折半(二分)是一种经典思想number_list = [0, 1, 2, 3, 4, 5, 6, 7]def linear_search(value, iterable): for index, val in enumerate(iterable): if val == value: ...原创 2019-09-25 20:18:08 · 81 阅读 · 0 评论 -
线性查找
线性查找就是从头找到尾,直到符合条件了就返回。比如在一个 list 中找到一个等于 5 的元素并返回下标:number_list = [0,1,2,3,4,5,6,7]def liner_search(value,iterable): for index, val in enumerate(iterable): if val == value: ...原创 2019-09-25 20:14:49 · 182 阅读 · 0 评论 -
递归
什么是递归?递归用一种通俗的话来说就是自己调用自己,但是需要分解它的参数,让它解决一个更小一点的问题,当问题小到一定规模的时候,需要一个递归出口返回。 这里举一个和其他很多老套的教科书一样喜欢举的例子,阶乘函数,我觉得用来它演示再直观不过。它的定义是这样的:我们很容易根据它的定义写出这样一个递归函数,因为它本身就是递归定义的。def fact(n): if n ==...原创 2019-09-25 20:10:02 · 133 阅读 · 0 评论 -
集合
#集合 set集合是一种不包含重复元素的数据结构,经常用来判断是否重复这种操作,或者集合中是否存在一个元素。这一章讲集合,实际上它的底层也是哈希表实现的,所以像实现 DictADT 一样,借助 HashTable 实现它也比较简单。# 集合操作集合可能最常用的就是去重,判断是否存在一个元素等,但是 set 相比 dict 有更丰富的操作,主要是数学概念上的。如果你学过《离散数学》中...原创 2019-09-25 20:06:21 · 263 阅读 · 0 评论 -
字典 dict
字典最常使用的场景就是 k,v 存储,经常用作缓存,它的 key 值是唯一的。内置库 collections.OrderedDict 还保持了 key 的添加顺序,其实用我们之前实现的链表也能自己实现一个 OrderedDict。# -*- coding: utf-8 -*-# 从数组和列表章复制的代码class Array(object): def __init__(...原创 2019-09-25 20:05:13 · 77 阅读 · 0 评论 -
哈希表
开放寻址法:# -*- coding: utf-8 -*-# 从数组和列表章复制的代码class Array(object): def __init__(self, size=32, init=None): self._size = size self._items = [init] * size def __g...原创 2019-09-25 20:02:57 · 82 阅读 · 0 评论 -
栈
from collections import dequeclass Node(object): def __init__(self, value=None, prev=None, next=None): self.value, self.prev, self.next = value, prev, nextclass CircularDoubleLin...原创 2019-09-25 12:34:22 · 74 阅读 · 0 评论 -
双端队列
原创 2019-09-25 10:22:12 · 352 阅读 · 0 评论 -
使用数组实现队列
import pytestclass Array(object): def __init__(self, size=32): self._size = size self._items = [None] * size def __getitem__(self, index): return self._items[inde...原创 2019-09-25 10:14:41 · 223 阅读 · 0 评论 -
用链表实现队列
from collections import dequeclass Node(object): def __init__(self, value=None, next=None): # 这里我们 root 节点默认都是 None,所以都给了默认值 self.value = value self.next = next d...原创 2019-09-25 09:57:06 · 144 阅读 · 0 评论 -
循环双链表
class Node(object): __slots__ = ('value', 'prev', 'next') # save memory def __init__(self, value=None, prev=None, next=None): self.value, self.prev, self.next = value, prev, n...原创 2019-09-24 20:35:30 · 89 阅读 · 0 评论 -
单链表
class Node(object): def __init__(self,value = None, next= None): self.value,self.next = value, nextclass LinkeList(object): def __init__(self,maxsize=None): self.maxs...原创 2019-09-24 19:08:37 · 95 阅读 · 0 评论 -
数组和列表list
from array import arrayl = list()l.append(1)l.append(2)arr = array('u','asdf')print(arr[0])print(arr[1])列表list操作 平均时间复杂度 list[index] O(1) list.append O(1) ...原创 2019-09-24 17:41:41 · 501 阅读 · 0 评论 -
1高级排序算法
归并排序现在我们就来看下归并排序是是如何利用分治法解决问题的。 分解:将待排序的 n 个元素分成各包含 n/2 个元素的子序列 解决:使用归并排序递归排序两个子序列 合并:合并两个已经排序的子序列以产生已排序的答案 考虑我们排序这个数组:[10,23,51,18,4,31,13,5] ,我们递归地将数组进行分解# -*- codi...原创 2019-10-05 20:27:10 · 109 阅读 · 0 评论