随笔分类 - Python
摘要:引言 算法分析 基本数据结构 概览 栈 stack 队列 Queue 双端队列 Deque 列表 List,链表实现 递归(Recursion) 定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫 优化问题与策略 查找与排序 查找:顺序查找与二分查找 排序:冒泡、选择、插入、希尔、归并、快速 散列、散
阅读全文
摘要:最短路径问题 概念 可以通过“traceroute”命令来跟踪信息传送的路径: traceroute www.lib.pku.edu.cn 可以将互联网路由器体系表示为一个带权边的图 路由器作为顶点,路由器之间网络连接作为边权重可以包括网络连接的速度、网络负载程度、分时段优先级等影响因素 作为一个抽
阅读全文
摘要:互联网 我们关注一下互联网相关的非常巨大图: 由主机通过网线(或无线)连接而形成的图; 以及由网页通过超链接连接而形成的图。 网页形成的图 以网页(URI作为id)为顶点,网页内包含的超链接作为边,可以转换为一个有向图。 得出这样的结论:网络具有一种基础结构,使得在某种程度上相似的网页相互聚集。 强
阅读全文
摘要:概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步。从图7-18可知,可以首先加热平底锅或者混合原材料。我们借助拓扑排序这种图算法来确定制作松饼的步骤。 从工作流程图得到工作次序排列的算法,称为“拓扑排序” 拓扑排序处理一个DAG(向无环图), 输
阅读全文
摘要:骑士周游问题 概念 在一个国际象棋棋盘上, 一个棋子“马”(骑士) , 按照“马走日”的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次。把一个这样的走棋序列称为一次“周游” 在8×8的国际象棋棋盘上, 合格的“周游”数量有1.305×1035这么多, 走棋过程中失败的周游就更多了 采用图搜索算法
阅读全文
摘要:词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE >> PALE>> SALE >> SAGE 目标是找到最短的单词变换序列 用图表示单词之间的关系; 用一种名为广度优先搜索 BFS的图算法找到
阅读全文
摘要:概念 图Graph是比树更为一般的结构, 也是由节点和边构成 实际上树是一种具有特殊性质的图 图可以用来表示现实世界中很多有意思的事物,包括道路系统、城市之间的航班、互联网的连接,甚至是计算机专业的一系列必修课 定义 一个图G可以定义为G=(V, E) 其中V是顶点的集合, E是边的集合, E中的每
阅读全文
摘要:定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个节点跟踪“平衡因子balance factor”参数 \(balance Factor=height
阅读全文
摘要:二叉搜索树,它是映射的另一种实现 映射抽象数据类型前面两种实现,它们分别是列表二分搜索和散列表。 操作 Map()新建一个空的映射。 put(key, val)往映射中加入一个新的键-值对。如果键已经存在,就用新值替换旧值。 get(key)返回key对应的值。如果key不存在,则返回None。 d
阅读全文
摘要:概念 队列有一个重要的变体,叫作优先级队列。 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的。 优先级最高的元素在最前,优先级最低的元素在最后。 实现优先级队列的经典方法是使用叫作二叉堆(Binary Heap)的数据结构。 二叉堆的入队操作和出队操作均可达到O(log n
阅读全文
摘要:遍历方式 前序遍历 在前序遍历中,先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树。 中序遍历 在中序遍历中,先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。 后序遍历 在后序遍历中,我们先递归地后序遍历访问左子树和右子树,最后访问根节点 实现代码 三种遍历的外部函
阅读全文
摘要:解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法、语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理解 表达式解析 \(((7+3)*(5-2))\) 叶节点保存操作数,内部节点保存操作符 树中每个子
阅读全文
摘要:概念 一种基本的“非线性”数据结构——树 根 枝 叶 广泛应用于计算机科学的多个领域 操作系统 图形学 数据库 计算机网络 特征 第一个属性是层次性,即树是按层级构建的,越笼统就越靠近顶部,越具体则越靠近底部。 第二个属性是,一个节点的所有子节点都与另一个节点的所有子节点无关。比如,猫属的子节点有家
阅读全文
摘要:散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度。 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为“散列Hashing“ 能够使得查找的次数降低到常数级别, 我们对数据项所处的位置就必须有更多的先验知识。 如
阅读全文
摘要:冒泡排序O(n²) —— bubbleSort 定义 冒泡排序多次遍历列表。它比较相邻的元素,将不合顺序的交换。每一轮遍历都将下一个最大值放到正确的位置上。本质上,每个元素通过“冒泡”找到自己所属的位置。 冒泡排序的算法思路在于对无序表进行多趟比较交换, 每趟包括了多次两两相邻比较, 并将逆序的数据
阅读全文
摘要:顺序查找 定义 通过下标, 按照顺序来访问和查找数据项 要确定列表中是否存在需要查找的数据项 算法分析 要点 确定基本计算步骤 基本计算步骤必须要足够简单, 并且在算法中反复执行 在查找算法中, 这种基本计算步骤就是进行数据项的比对,比对的次数决定了算法复杂度 分类 无序列表顺序查找O(n) 数据在
阅读全文
摘要:分治策略:解决问题的典型策略,分而治之 将问题分为若干更小规模的部分 通过解决每一个小规模部分问题,并将结果汇总得到原问题的解 递归算法与分治策略 递归三定律 体现了分支策略 应用相当广泛 排序 查找 遍历 求值等 优化问题 计算机科学中许多算法都是为了找到某些问题的最优解 两点之间最短路径 能最好
阅读全文
摘要:定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决。 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数。 举例 数列求和 def listsum(numlist): if len(numlist) == 1: return num
阅读全文
摘要:无序表链表 定义 一种数据项按照相对位置存放的数据集 抽象数据类型无序列表 UnorderedList 方法 list() 创建一个新的空列表。它不需要参数,而返回一个空列表。 add(item) 将新项添加到列表,没有返回值。假设元素不在列表中。 remove(item) 从列表中删除元素。需要一
阅读全文
摘要:定义 双端队列(deque 或 double-ended queue)与队列类似,也是一系列元素的有序组合。其两端称为队首(front)和队尾(rear),元素在到达两端之前始终位于双端队列中。 元素可以从两端插入,也可以从两端删除。 数据项不满足严格的“后进先出”或“先进先出”顺序,需自行维护 抽
阅读全文

浙公网安备 33010602011771号