这段时间把<Data Structure and Algorithms with python>以及<Problem Solving with  Algorithms and DataStructures>看完了(图那部分没仔细看,毕业设计开始了,有点忙).现在开始写点总结啦,主要顺序按照是problem solving那本书的,感觉这本条理更加清晰简单,而另一本相对杂乱些,不过其代码写的更pythonic一些.[github地址,包含了那两本书带笔记版以及下面零的代码] 这作为第…
少年,不知道你好记不记得第三篇文章讲python内建数据结构的方法及其时间复杂度时里面关于dict与set的时间复杂度[为何访问元素为O(1)]原理我说后面讲吗?其实就是这篇文章讲啦. 目录: 一:Hash的定义 二:dict与set的实现原理 三:常用构造hash函数的方法 四:hash碰撞及其解决方法 五:dict的实现 一:Hash的定义 Hash,一般翻译做“散列”,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.[不同的输入可能会散列成相同的输出,所以不可能…
定义:递归就是不断分割整体成部分直到可以轻易解决分割出来的部分. 递归表达式三定律: 1:递归表达式必须有个最小单元     (最小单元既是停止递归调用以及能够直接运算的) 2:递归表达式在运算过程中必须向最小单元移动 3:递归表达式必须递归的调用自己 一:简单实例: 1:求数字数组所有元素的和 def sum(seq=[]): if len(seq)==1: return seq[0] return seq[0]+sum(seq[1:]) print('sum of the list:',su…
顶先最后推荐:哈哈,意思是放到顶部强调其重要性,但是应该我总结的六种算法看完了后再看的一篇醍醐灌顶的文章 一:冒泡排序(Bubble Sort) 原理:假设有n个数,第一轮时:从第一个元素开始,与相邻的元素比较,如果前面的元素小就交换,直到第n-1个元素时,这样的结果是将最大的元素放到了最后,同理,第二轮还是从第一个元素开始比较,直到第n-2个元素,这样能够把剩下的n-1个数中的最大的数放到第n-1的位置,一直这样进行n-1轮就能够完成排序. def Bublesort(seq): i = 0…
目录: 前言 1:栈 1.1:栈的实现 1.2:栈的应用: 1.2.1:检验数学表达式的括号匹配 1.2.2:将十进制数转化为任意进制 1.2.3:后置表达式的生成及其计算 2:队列 2.1:队列的实现 2.2:队列的应用之囚徒问题 3:双端队列 3.1:双端队列的实现 3.2:双端队列的应用之回文检测 4:列表 3.1:链表的实现 前言 线性数据结构有四种:栈(stack),队列(queue),双端队列(deque),列表(list) 线性数据结构就是一群数据的集合,数据的位置和其加入的先后顺…
目录 一:python内部数据类型分类 二:各数据结构 一:python内部数据类型分类 这里有个很重要的东西要先提醒注意一下:原子性数据类型和非原子性数据类型的区别 Python内部数据从某种形式上可以分为两种: 其一是原子性数据类型:int,float,str 其余的是非原子性的(按有序性分): 有序的:list, tuple 无序的:set, dict 那么什么是原子性呢,在第一篇讲赋值语句时有个例子: 赋值语句:x = 6 其实这个过程是建立了一个指向(reference),左边的是指向…
目录: 一:大O记法 二:各函数高阶比较 三:常用算法和数据结构的复杂度速查表 四:常见的logn是怎么来的 一:大O记法 算法复杂度记法有很多种,其中最常用的就是Big O notation(大O记法): 对于其中的g(x)是关于操作元素数x为自变量的计算次数函数,而x趋近无穷大从而只留下最高项且忽略其常数项是为了集中看函数随着元素个数的大量增加后运行时间的增加速度从而用来衡量时间复杂度. e.g: for i in range(x): print(‘aha’) print(i) print(…
一:线性查找(Sequential Search) 线性查找可以说是我们用的最早也会是用的最多的查找方式了.其对应的是线性数据结构,回顾一下线性数据结构,其特点是先后加入的元素是有顺序的,相邻的.而线性结构就是按其顺序挨个遍历的查找方式: for i in range(len(seq)): if seq[i] == item: print('find it in position %d'%i) break 显然,这是O(n)的时间复杂度 二:二分查找(Binary Search) 对于已经排好序…
本文实例讲述了Python实现的数据结构与算法之队列.分享给大家供大家参考.具体分析如下: 一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行. 二.ADT 队列ADT(抽象数据类型)一般提供以下接口: ① Queue() 创建队列② enqueue(item) 向队尾插入项③ dequeue() 返回队首的项,并从队列中删除该项④ empty() 判断队列是否为空⑤ size() 返回队列中项的个数 队列操作的…
一.概述 用Python实现的数据结构与算法 涵盖了常用的数据结构与算法(全部由Python语言实现),是 Problem Solving with Algorithms and Data Structures using Python(简写为PSADSP)的读书笔记. PSADSP 对经典的数据结构与算法进行了全面而细致地讲解,有兴趣的读者可以直接阅读该书.根据个人的学习进度,本文当前只摘取和总结了书中的部分内容,后续会逐步更新. 二.目录 基本数据结构 用Python实现的数据结构与算法:堆…
写在前面的话:关于数据结构与算法讲解的书籍很多,但是用python语言去实现的不是很多,最近有幸看到一本这样的书籍,由Brad Miller and David Ranum编写的<Problem Solving with Algorithms and Data Structures Using Python>,地址为:http://interactivepython.org/runestone/static/pythonds/index.html是英文的,写的不错,里面代码的实现也很详细,很多…
既然采用了 Python 编程语言实现数据结构,就要充分发挥 Python 语言的语法特性. 参考<Python 算法教程><数据结构与算法 -- Python 语言描述>: 1. 用 Python 的 list 实现树形结构 二叉树是递归结构,或者说二叉树是通过递归定义的(二叉树的左右子树还是二叉树),而 Python 的 list 也是递归结构.基于 list 类型很容易实现二叉树,例如,可以采用下面的设计: 空树(比如当左子树或右子树为空时)用 None 表示 非空二叉树用包…
一.链表的定义 用链接关系显式表示元素之间顺序关系的线性表称为链接表或链表. 二.单链表的python实现 class Node(object): """定义节点""" def __init__(self, elem): self.elem = elem self.next = None class SingleLinkList(object): """单链表操作""" def __in…
一.什么是顺序表: 线性表的两种基本的实现模型: 1.将表中元素顺序地存放在一大块连续的存储区里,这样实现的表称为顺序表(或连续表).在这种实现中,元素间的顺序关系由它们的存储顺序自然表示. 2.将表中元素存放在通过链接构造起来的一系列存储模块里,这样实现的表称为链接表,简称链表. 二.顺序表两种基本形式: 三.顺序表结构: 四.实现方式: 五.增加元素: a. 尾端加入元素,时间复杂度为O(1) b. 非保序的加入元素(不常见),时间复杂度为O(1) c. 保序的元素加入,时间复杂度为O(n)…
一.算法 1.算法的时间复杂度 大 O 记法,是描述算法复杂度的符号O(1) 常数复杂度,最快速的算法. 取数组第 1000000 个元素 字典和集合的存取都是 O(1) 数组的存取是 O(1) O(logN) 对数复杂度 假设有一个有序数组,以二分法查找 O(n) 线性复杂度 假设有一个数组,以遍历的方式在其中查找元素 最坏情况是全部过一遍 O(nlogn) 求两个数组交集,其中一个是有序数组 A 数组每一个元素都要在 B 数组中进行查找操作 每次查找如果使用二分法则复杂度是 logN O(N…
一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left(小于划分元素pivot的部分).划分元素pivot.right(大于划分元素pivot的部分),此时,划分元素pivot已经在列表的最终位置上:然后分别对left和right两个部分进行 递归排序. 其中,划分元素的 选取 直接影响到快速排序算法的效率,通常选择列表的第一个元素或者中间元素或者最后一…
一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left(小于划分元素pivot的部分).划分元素pivot.right(大于划分元素pivot的部分),此时,划分元素pivot已经在列表的最终位置上:然后分别对left和right两个部分进行 递归排序. 其中,划分元素的 选取 直接影响到快速排序算法的效率,通常选择列表的第一个元素或者中间元素或者最后一…
一.顺序搜索 顺序搜索 是最简单直观的搜索方法:从列表开头到末尾,逐个比较待搜索项与列表中的项,直到找到目标项(搜索成功)或者 超出搜索范围 (搜索失败). 根据列表中的项是否按顺序排列,可以将列表分为 无序列表 和 有序列表.对于 无序列表,超出搜索范围 是指越过列表的末尾:对于 有序列表,超过搜索范围 是指进入列表中大于目标项的区域(发生在目标项小于列表末尾项时)或者指越过列表的末尾(发生在目标项大于列表末尾项时). 1.无序列表 在无序列表中进行顺序搜索的情况如图所示: def seque…
一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接(参考 <算法:C语言实现>). 根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环链表等.其中,单向链表和单向循环链表的结构如下图所示: 二.ADT 这里只考虑单向循环链表ADT,其他类型的链表ADT大同小异.单向循环链表ADT(抽象数据类型)一般提供以下接口: SinCycLinkedlist() 创建单向循环链表 add(item) 向链表…
一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行. 二.ADT 队列ADT(抽象数据类型)一般提供以下接口: Queue() 创建队列 enqueue(item) 向队尾插入项 dequeue() 返回队首的项,并从队列中删除该项 empty() 判断队列是否为空 size() 返回队列中项的个数 队列操作的示意图如下: 三.Python实现 使用Python的内建类型list列表,可以很方便地实现队列ADT:…
一.概述 堆栈(Stack)是一种后进先出(LIFO)的线性数据结构,对堆栈的插入和删除操作都只能在栈顶(top)进行. 二.ADT 堆栈ADT(抽象数据类型)一般提供以下接口: Stack() 创建堆栈 push(item) 向栈顶插入项 pop() 返回栈顶的项,并从堆栈中删除该项 clear() 清空堆栈 empty() 判断堆栈是否为空 size() 返回堆栈中项的个数 top() 返回栈顶的项 堆栈操作的示意图如下: 三.Python实现 使用Python的内建类型list列表,可以很…
1.解压序列赋值给多个变量 任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量. 唯一的前提就是变量的数量必须跟序列元素的数量是一样的. >>> data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]>>> name, shares, price, date = data >>> name, shares, price, (year, mon, day) = data >>>…
一.顺序搜索 顺序搜索 是最简单直观的搜索方法:从列表开头到末尾,逐个比较待搜索项与列表中的项,直到找到目标项(搜索成功)或者 超出搜索范围 (搜索失败). 根据列表中的项是否按顺序排列,可以将列表分为 无序列表 和 有序列表.对于 无序列表,超出搜索范围 是指越过列表的末尾:对于 有序列表,超过搜索范围 是指进入列表中大于目标项的区域(发生在目标项小于列表末尾项时)或者指越过列表的末尾(发生在目标项大于列表末尾项时). 1.无序列表 在无序列表中进行顺序搜索的情况如图所示: def seque…
四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ…
一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两端(队首和队尾)都可以进行,删除操作也一样. 二.ADT 双端队列ADT(抽象数据类型)一般提供以下接口: Deque() 创建双端队列 addFront(item) 向队首插入项 addRear(item) 向队尾插入项 removeFront() 返回队首的项,并从双端队列中删除该项 remov…
递归:直接或者间接地调用自己.比如计算连续数的阶乘,计算规律:n!=(n-1)!*n. 每个递归方法都有一个基值(终止)条件,以防止无线地递归下去,以及由此引发的程序崩溃. 采用递归是因为它可以从概念上简化问题,递归算法结构清晰.可读性强,且容易采用数学归纳法证明算法正确性.然而时间花费和空间花费都比非递归算法更大. 关于递归与分治: 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题与原问题相同且相互独立. 递归地解这些子问题,然后将各子问题的解合并得到原问题的解.…
一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接.根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环链表等.其中,单向链表和单向循环链表的结构如下图所示: 二.ADT 这里只考虑单向循环链表ADT,其他类型的链表ADT大同小异.单向循环链表ADT(抽象数据类型)一般提供以下接口: ① SinCycLinkedlist() 创建单向循环链表② add(item) 向链表中插入数据项③ remove…
一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两端(队首和队尾)都可以进行,删除操作也一样. 二.ADT 双端队列ADT(抽象数据类型)一般提供以下接口: ① Deque() 创建双端队列② addFront(item) 向队首插入项③ addRear(item) 向队尾插入项④ removeFront() 返回队首的项,并从双端队列中删除该项⑤…
多变量赋值 a = [1,2,(3,4)] b,c,d = a print(b,c,d) b,c,(d,e) = a print(b,c,d,e) 1 2 (3, 4) 1 2 3 4 a = "zxc" b,c,d = a print(b,c,d) z x c *:集成不定长元素 & 集合型实参展开为多个虚参 record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212') name, email, *…
1.字典中一个键映射多个值 可以使用collections中的defaultdict来实现,defalultdict接受list或者set为参数 from collections import defaultdict d = defaultdict(list) d['a'].append(1) d['a'].append(2) d['b'].append(4) >>> ddefaultdict(<type 'list'>, {'a': [1, 2], b: [4]}) 2.字…