数据结构与算法(Python)】的更多相关文章

第一篇 基本概念 01 什么是数据结构 02 什么是算法 03 应用实例-最大子列和问题 第二篇 线性结构 01 线性表及其实现 02 堆栈 03 队列 04 应用实例-多项式加法运算 05 小白专场-多项式乘法与加法运算-c语言实现 05 小白专场-多项式乘法与加法运算-python语言实现 第三篇 树(上) 01 树与树的表示 02 二叉树及存储结构 03 二叉树的遍历 04 小白专场-树的同构-c语言实现 04 小白专场-树的同构-python语言实现 第三篇 树(中) 01 二叉搜索树…
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学想要转行机器学习,也确实掌握了一些机器学习模型原理并具备基础的编程功底,但是在笔试.面试的时候还会掉链子,大概率是数据结构和算法知识薄弱.数据结构和算法是程序员的内功心法和基本功.无论是人工智能还是其它计算机科学领域,掌握扎实的数据结构和算法知识,往往会助力不少! 北京大学公开课<数据结构与算法Pyth…
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计算机科学家的目标是得出一个算法(algorithm) ,写出一组解决该问题可能出现的任何情况的步步为营的指令.算法通过有限过程解决问题.算法是解决方案. 计算机科学可以被看作是对算法的研究. 可计算 抽象 理解什么是"抽象"以及抽象在问题解决过程中的作用 定义 抽象使我们能以一种区分所谓的…
一.数据结构与算法概述 数据结构与算法的定义 我们把现实中大量而且非常复杂的问题以特定的数据类型(个体)和特定的存储结构(个体的关系)保存到相应的主存储器(内存)中,以及在此基础上为实现某个功能而执行的相应操作,这个相应操作也叫做算法. 数据结构 = 个体 + 个体的关系 算法 = 对存储数据的操作 二.衡量算法的标准 时间复杂度 指的是大概程序执行的次数,并非程序执行的时间 空间复杂度 指的是程序执行过程中,大概所占有的最大内存 常用的查找 顺序查找 lowB for循环 时间复杂度 O(n)…
线性结构Linear Structure ❖线性结构是一种有序数据项的集合,其中 每个数据项都有唯一的前驱和后继 除了第一个没有前驱,最后一个没有后继 新的数据项加入到数据集中时,只会加入到原有 某个数据项之前或之后 具有这种性质的数据集,就称为线性结构  ❖线性结构总有两端,在不同的情况下,两 端的称呼也不同 有时候称为"左""右"端."前""后"端. "顶""底"端  ❖两端的称呼并…
散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为"散列Hashing" 能够使得查找的次数降低到常数级别, 我们对数据项所处的位置就必须有更多的先验知识. 如果我们事先能知道要找的数据项应该出现在数据集中的什么位置, 就可以直接到那个位置看看数据项是否存在即可 由数据项的值来确定其存放位置 基本概念 散列表(hash table, 又称哈希表)…
Hash Table 散列表(hash table)也被称为哈希表,它是一种根据键(key)来存储值(value)的特殊线性结构. 常用于迅速的无序单点查找,其查找速度可达到常数级别的O(1). 散列表数据存储的具体思路如下: 每个value在放入数组存储之前会先对key进行计算 根据key计算出一个重复率极低的指纹 根据这个指纹将value放入到数组的相应槽位中 同时查找的时候也将经历同样的步骤,以便能快速的通过key查出想要的value. 这一存储.查找的过程也被称为hash存储.hash查…
什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平均情况,平均状况体现主流性能 累计求和案例 import time def sumOFN2(n): start=time.time() theSum=0 for i in range(1,n+1): theSum+=i end=time.time() return theSum,end-start…
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def listsum(numlist): if len(numlist) == 1: return numlist[0] else: return numlist[0]+listsum(numlist[1:]) if __name__ == "__main__": print(listsum([…
无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表.它不需要参数,而返回一个空列表. add(item) 将新项添加到列表,没有返回值.假设元素不在列表中. remove(item) 从列表中删除元素.需要一个参数,并会修改列表.此处假设元素在列表中. search(item) 搜索列表中的元素.需要一个参数,并返回一个布尔值. isEmpty() 判断列表是否为空.不需要参数,并返回一个布尔值. siz…
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使用叫作二叉堆(Binary Heap)的数据结构. 二叉堆的入队操作和出队操作均可达到O(log n). 其逻辑结构上像二叉树, 却是用非嵌套的列表来实现的 二叉堆有两个常见的变体: 最小堆(最小的元素一直在队首) 最大堆(最大的元素一直在队首) 二叉堆的操作 BinaryHeap()新建一个空的二…
概念 一种基本的"非线性"数据结构--树 根 枝 叶 广泛应用于计算机科学的多个领域 操作系统 图形学 数据库 计算机网络 特征 第一个属性是层次性,即树是按层级构建的,越笼统就越靠近顶部,越具体则越靠近底部. 第二个属性是,一个节点的所有子节点都与另一个节点的所有子节点无关.比如,猫属的子节点有家猫(英文名为Domestica)和狮. 第三个属性是,叶子节点都是独一无二的. 例子 文件系统 HTML文档(嵌套标记) 域名体系 术语 节点 节点是树的基础部分. 它可以有自己的名字,我们…
ADT Rational: #定义有理数的抽象数据类型 Rational(self, int num, int den) #构造有理数num/den +(self, Rational r2) #求出本对象加r2的结果 -(self, Rational r2) #求出本对象减r2的结果 *(self, Rational r2) #求出本对象乘以r2的结果 /(self, Rational r2) #求出本对象除以r2的结果 num(self) #取出本对象的分子 den(self) #取出本对象的…
ADT Date: #定义日期对象的抽象数据类型 Date(self, int year, int month, int day) #构造表示year/month/day的对象 difference(self, Date d2) #求出self和d2的日期差 plus(self, int n) #计算出日期第self之后n天的日期 num_date(self, int year, int n) #计算year年第n天的日期 adjust(self, int n) #将日期d调整n天(n为带符号整…
题目:定义一个表示时间的类Timea)Time(hours,minutes,seconds)创建一个时间对象:b)t.hours(),t.minutes(),t.seconds()分别返回时间对象t的小时,分钟和秒值c)为Time对象定义加法和减法操作(用运算符+和-)d)定义时间对象的等于和小于关系对象(用运算符==和<) #!/usr/bin/env python # -*- coding:utf-8 -*- """ 定义一个表示时间的类Time a)Time(ho…
说明:部分代码参考了Harrytsz的文章:https://blog.csdn.net/Harrytsz/article/details/86645857 巩固 R-1.1 编写一个Python函数 is_multiple(n, m),用来接收两个整数值 n 和 m,如果 n 是 m 的倍数,即存在整数 i 使得 n = mi,那么函数返回 True,否则返回 False. R-1.2 编写一个Python函数 is_even(k),用来接收一个整数 k,如果 k 是偶数返回 True,否则返回…
什么是算法分析 对比程序,还是算法? ❖如何对比两个程序? 看起来不同,但解决同一个问题的程序,哪个" 更好"? ❖程序和算法的区别 算法是对问题解决的分步描述 程序则是采用某种编程语言实现的算法,同一个 算法通过不同的程序员采用不同的编程语言,能 产生很多程序 大O表示法 算法时间度量指标 ❖ 一个算法所实施的操作数量或步骤数可作为 独立于具体程序/机器的度量指标 哪种操作跟算法的具体实现无关? 需要一种通用的基本操作来作为运行步骤的计量单位 ❖ 赋值语句是一个合适的选择 一条赋值语…
引言 算法分析 基本数据结构 概览 栈 stack 队列 Queue 双端队列 Deque 列表 List,链表实现 递归(Recursion) 定义及应用:分形树.谢尔宾斯基三角.汉诺塔.迷宫 优化问题与策略 查找与排序 查找:顺序查找与二分查找 排序:冒泡.选择.插入.希尔.归并.快速 散列.散列函数.区块链 树 相关术语.定义.实现方法 二叉树的应用:解析树 树的遍历 Tree Traversals 利用二叉堆实现优先级队列 二叉查找树 Binary Search Tree 平衡二叉搜索树…
分治策略:解决问题的典型策略,分而治之 将问题分为若干更小规模的部分 通过解决每一个小规模部分问题,并将结果汇总得到原问题的解 递归算法与分治策略 递归三定律 体现了分支策略 应用相当广泛 排序 查找 遍历 求值等 优化问题 计算机科学中许多算法都是为了找到某些问题的最优解 两点之间最短路径 能最好匹配一系列点的直线 满足一定条件的最小集合 经典案例:找零兑换 贪心策略 兑换最少个数的硬币 贪心策略及失效 63=252+101+1*3 63=21*3 递归解法 步骤 确定基本结束条件 需要兑换的…
最短路径问题 概念 可以通过"traceroute"命令来跟踪信息传送的路径: traceroute www.lib.pku.edu.cn 可以将互联网路由器体系表示为一个带权边的图 路由器作为顶点,路由器之间网络连接作为边权重可以包括网络连接的速度.网络负载程度.分时段优先级等影响因素 作为一个抽象,我们把所有影响因素合成为单一的权重 解决信息在路由器网络中选择传播速度最快路径的问题, 就转变为在带权图上最短路径的问题. 这个问题与广度优先搜索BFS算法解决的词梯问题相似, 只是在边…
互联网 我们关注一下互联网相关的非常巨大图: 由主机通过网线(或无线)连接而形成的图: 以及由网页通过超链接连接而形成的图. 网页形成的图 以网页(URI作为id)为顶点,网页内包含的超链接作为边,可以转换为一个有向图. 得出这样的结论:网络具有一种基础结构,使得在某种程度上相似的网页相互聚集. 强连通分支Strongly Connected Components 概念 通过一种叫作强连通分支的图算法,可以找出图中高度连通的顶点簇(发现高度聚集节点群). 强连通分支,定义为图G的一个子集C C中…
概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步骤. 从工作流程图得到工作次序排列的算法,称为"拓扑排序" 拓扑排序处理一个DAG(向无环图), 输出顶点的线性序列使得两个顶点v,w,如果G中有(v,w)边,在线性序列中v就出现在w之前. 拓扑排序广泛应用在依赖事件的排期上,还可以用在项目管理. 数据库查询优化和矩阵乘法的次序优化上 算…
骑士周游问题 概念 在一个国际象棋棋盘上, 一个棋子"马"(骑士) , 按照"马走日"的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次.把一个这样的走棋序列称为一次"周游" 在8×8的国际象棋棋盘上, 合格的"周游"数量有1.305×1035这么多, 走棋过程中失败的周游就更多了 采用图搜索算法, 是解决骑士周游问题最容易理解和编程的方案之一 解决方案还是分为两步: 首先将合法走棋次序表示为一个图 采用图搜索算法搜寻一个长…
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE >> PALE>> SALE >> SAGE 目标是找到最短的单词变换序列 用图表示单词之间的关系: 用一种名为广度优先搜索 BFS的图算法找到从起始单词到结束单词的最短路径. 构建词梯图 算法 首先是将所有单词作为顶点加入图中,再设法建立顶点之间的边 对每个顶点(单词) , 与其…
解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理解 表达式解析 \(((7+3)*(5-2))\) 叶节点保存操作数,内部节点保存操作符 树中每个子树都表示一个子表达式 构建解析树 定义规则 如果当前标记是(,就为当前节点添加一个左子节点,并下沉至该子节点: 如果当前标记在列表['+', '-', '/', '*']中,就将当前节点的值设为当前标…
挖一个坑,先立个flag,后面慢慢填坑. 先放个其它人写的链接…
# coding:utf-8 # 单向循环链表的相关操作: # is_empty() 判断链表是否为空 # length() 返回链表的长度 # travel() 遍历 # add(item) 在头部添加一个节点 # append(item) 在尾部添加一个节点 # insert(pos, item) 在指定位置pos添加节点 # remove(item) 删除一个节点 # search(item) 查找节点是否存在 class Node(object): """节点&quo…
# coding:utf-8 # 双向链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历链表 # add(item) 链表头部添加 # append(item) 链表尾部添加 # insert(pos, item) 指定位置添加 # remove(item) 删除节点 # search(item) 查找节点是否存在 class Node(object): """节点""" def…
# coding:utf-8 # 单链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历整个链表 # add(item) 链表头部添加元素 # append(item) 链表尾部添加元素 # insert(pos, item) 指定位置添加元素 # remove(item) 删除节点 # search(item) 查找节点是否存在 class Node(object): """节点""&quo…
概念 图Graph是比树更为一般的结构, 也是由节点和边构成 实际上树是一种具有特殊性质的图 图可以用来表示现实世界中很多有意思的事物,包括道路系统.城市之间的航班.互联网的连接,甚至是计算机专业的一系列必修课 定义 一个图G可以定义为G=(V, E) 其中V是顶点的集合, E是边的集合, E中的每条边e=(v, w), v和w都是V中的顶点: 如果是赋权图,则可以在e中添加权重分量子图: V和E的子集 术语表 顶点Vertex(也称"节点Node") 是图的基本组成部分,顶点具有名称…