
数据结构和基本算法
文章平均质量分 89
PAT-python-zjw
人生苦短,我用Python
展开
-
绪论
1.基本概念数据:描述客观事物的符号,可被计算机输入和处理。数据元素:数据的基本单位,在计算机中通常被作为一个整体处理。数据对象:性质相同的数据元素所组成的集合。数据项:数据的不可分割的最小单位,一个数据元素常由多个数据项组成。(假如一个人就是一个数据元素,而眼睛,嘴巴,鼻子等器官可比喻为数据项)。数据结构:相互之间存在一种或多种特定关系的数据元素的集合。从逻辑结构来看,包原创 2017-05-01 15:46:39 · 441 阅读 · 0 评论 -
归并排序(递归和非递归)
学习之后,自己练习手写一下排序算法,加深印象原理:假设初始序列含有n个记录,则可以看做是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的子序列;再两两归并,如此重复,最终得到一个长度为n的有序序列递归方法#define MAXSIZE 10#include <stdio.h>struct a{ int array[MAXSIZE]...原创 2018-03-28 20:24:01 · 1912 阅读 · 0 评论 -
二分查找、插值查找、斐波那契查找
1 概念在有序表中,取中间记录作为比较对象,将其与给定值相比较,若其等于给定值,则查找成功;若其小于给定值,则在中间记录的右半区继续查找;若其大于给定值,则在中间记录的左半区继续查找。不断重复以上过程,直到查找成功或无匹配记录。使用该查找方法的前提条件在于,线性表中的数据必须有序,且必须采用顺序存储的方式。2 代码var array = [1,2,3,4,5,6,7,8,9...原创 2018-08-15 19:59:13 · 1066 阅读 · 0 评论 -
郝夫曼(Huffman)树及其应用
1. 基本概念路径长度:树中一个结点到另一个结点路径上的分支数目。 树的路径长度:从树根到每一结点的路径长度之和。 带权路径长度:结点到树根之间的路径长度与结点上权的乘积。 树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。 郝夫曼树(最优二叉树):对于一棵有n个叶子结点的二叉树,带权路径长度最小的二叉树。 第一棵树 WPL=7*2+5*2+2*2+4*2=36原创 2018-08-13 20:30:22 · 683 阅读 · 0 评论 -
重建二叉树(JS实现)
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/* function TreeNode(x) { this.val = x; this.left = null; this.right...原创 2018-08-25 10:53:02 · 701 阅读 · 1 评论 -
用两个栈实现队列(JS实现)
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型思路假设两个栈分别为 stack1 和 stack2,将stack1用于入队操作,将stack2用于出队操作。当stack2为空时,将stack1的元素弹出并推入stack2中。每次出队操作,就是对stack2的弹出操作。var stack1=[]; var stack2=[];f...原创 2018-08-25 13:05:53 · 1748 阅读 · 0 评论 -
js实现二叉查找树的建立、插入、删除、遍历操作
1 概念二叉排序树(二叉查找树),它或者是一颗空树,或者是具有以下性质的二叉树:任意一个结点左子树上的所有结点值均小于该结点值任意一个结点右子树上的所有结点值均大于该结点值例如下图: 2 插入和建立二叉排序树结点的数据结构function newNode(value){ this.value = value; this.left = null;...原创 2018-09-02 22:42:21 · 1208 阅读 · 0 评论 -
B树和B+树
B树1 定义B树是一种平衡的多路查找树,其每一个非根节点都有多个元素和孩子,且所有叶子结点都在同一层次上。这种类型的树在文件系统中很有用。节点的最大孩子数目称为B树的阶,例如一个3阶的B树(也称2-3树)如图1:一棵m阶的B树,或为空树,或为满足下列特性的m叉树:树中每个节点至多有m棵子树若根结点不是叶子节点,那么至少有两棵子树除根之外的所有非终端节点至少有【m/2】(不小于m/2...原创 2018-12-19 15:42:16 · 1677 阅读 · 0 评论 -
字典树
1 定义键树又称数字查找树,它是一棵度大于2的树,树中的每个节点值含有组成关键字的符号。例如,若关键字是数值,则节点中只包含一个数位。若关键字是单词,则节点中只包含一个字母字符。这种树会给某种类型的关键字的表的查找带来方便。通常键树有两种存储结构:双链树和Trie树2 双链树双链树是以孩子兄弟链表来表示的键树,每个分支节点包含3个域:symbol域(用于存储关键字的一个字符),first...原创 2018-12-19 17:34:09 · 550 阅读 · 0 评论 -
图的概念和定义
1 定义图是由顶点的有穷非空集合和顶点之间边的集合组成,表示为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。若顶点vi到vj之间的边没有方向,则这条边为无向边,表示为(vi,vj)或(vj,vi),反之为有向边(或弧),表示为<vi,vj>,其中vi称为弧尾,vj称为弧头。若图中所有边都为无向边,则该图为无向图,反之若都为有向边,则为有向图。 简单图:...原创 2018-12-20 14:38:47 · 9841 阅读 · 0 评论 -
散列表
1 定义散列技术是在记录的存储位置和它的关键位置之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key),即: 存储位置 = f(关键字)我们把对应关系f称为散列函数(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续的存储空间称为散列表或hash表2 常见的散列函数选取好的散列函数的原则:计算简单、散列地址分布均匀直接定址...原创 2018-12-16 11:05:40 · 519 阅读 · 0 评论 -
图的存储结构(JS实现)
1 邻接矩阵图的邻接矩阵存储方式是用两个数组来表示图,一个一维数组存储图中的顶点信息,一个二维数组存储图中的边或弧的信息。在无向图中,二维矩阵是对称的,而在有向图中,则不是。若边上有权值,那么我们将矩阵值定义为://图的邻接矩阵存储方式...原创 2018-12-22 10:39:51 · 1245 阅读 · 0 评论 -
JS实现图的深度优先遍历(DFS)和广度优先遍历(BFS)
1 建立测试图(邻接矩阵和邻接表存储形式)首先建立一个图用于后续代码的测试,在此以无向图为例,且所有边的权值都为1。存储方式分别为邻接矩阵和邻接表(见上一篇介绍)邻接矩阵:class Graph{ constructor(v,vr){ let len = v.length this.vexs = [].slice.apply(v); let arcs = []; for ...原创 2018-12-22 17:08:40 · 2904 阅读 · 0 评论 -
最小生成树-普里姆(Prim)和克鲁斯卡尔(Kruskal)算法JS实现
如何在n个顶点,n*(n-1)/2条边中,筛选出具有n-1条边的,且具有最小代价的连通网呢?这就是最小生成树问题,下面介绍两种算法:1 普里姆(Prim)算法首先建立图的邻接矩阵存储:class Graph{ constructor(v,vr){ let len = v.length this.vexs = [].slice.apply(v); let arcs = []; ...原创 2018-12-23 14:46:08 · 620 阅读 · 0 评论 -
平衡二叉树AVL(JS实现)
1 定义平衡二叉树是一种二叉排序树,其中每个节点的左子树和右子树的高度差至多等于1。其中,二叉树节点的左子树深度减去右子树深度的值称为平衡因子(BF),因此平衡二叉树节点的平衡因子值只能为1、0或-1。距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树,我们称为最小不平衡子树。2 平衡二叉树的构建过程平衡二叉树的构建过程基于二叉排序树的构建过程,在插入节点的过程中,一旦出现不平衡...原创 2018-12-18 13:12:05 · 1706 阅读 · 0 评论 -
最短路径-迪杰斯特拉(Dijkstra)和弗洛伊德(Floyd)算法JS实现
1 测试图建立(邻接矩阵)class Graph{ constructor(v,vr){ let len = v.length this.vexs = [].slice.apply(v); let arcs = []; for (let i=0;i&lt;len;i++){ arcs[i] = new Array(len); for (let j=0;j&lt;l...原创 2018-12-24 10:58:01 · 923 阅读 · 0 评论 -
拓扑排序JS实现
1 定义在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称为AOV网(Activity On Vertex Network)设G={V,E}是一个具有n个顶点的有向图,V中的顶点序列v1、v2… 满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必须在顶点vj之前,则称这样的顶点序列为一个拓扑序列拓扑排序就是对一个有向图构造拓扑序列...原创 2018-12-24 16:16:20 · 1819 阅读 · 0 评论 -
快速排序
学习之后,自己练习手写一下排序算法,加深印象原理:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。#define MAXSIZE 10#include <stdio.h>struct a{ int array[MAXSIZE]; //数组用于存储排序数...原创 2018-03-31 16:53:54 · 430 阅读 · 0 评论 -
希尔排序
学习之后,自己练习手写一下排序算法,加深印象原理:将相距某个“增量”的记录组成一个子序列,在各个子序列内分别进行直接插入排序后得到基本有序的结果。所谓基本有序,就是小的关键字在前面,大的基本在后面,不大不小的基本在中间,比如{2,1,3,6,4,7,5,8,9}就可以称为基本有序#define MAXSIZE 10#include <stdio.h>struct a{...原创 2018-03-21 11:11:10 · 346 阅读 · 0 评论 -
1025. 反转链表 (25) python篇
1025. 反转链表 (25)时间限制 300 ms内存限制 65536 kB代码长度限制 8000 B判题程序 Standard 作者 CHEN, Yue给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5原创 2017-04-17 21:54:44 · 1348 阅读 · 1 评论 -
1051. Pop Sequence
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of t原创 2017-05-12 16:23:23 · 620 阅读 · 0 评论 -
串
1.基本概念由零个或多个字符组成的有限序列。2.抽象数据类型(ADT)数据对象:串的数据对象约束为字符集基本操作:原创 2017-05-13 08:34:39 · 740 阅读 · 0 评论 -
队列
1 基本概念队列是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端删除元素。原创 2017-05-05 21:22:53 · 598 阅读 · 1 评论 -
栈
1 基本概念栈是限定仅在表尾进行插入或删除操作的线性表。表头称为栈底,表尾称为栈顶,不含元素的空栈叫做空栈。栈具有后进先出的特点。2 抽象数据类型数据对象原创 2017-05-03 16:43:45 · 574 阅读 · 0 评论 -
线性表
1.基本概念n个数据元素的有限序列2 抽象数据类型(ADT)数据对象:{a1,a2,.....,an},每个元素类型为DataType。数据关系:除第一个元素外,每一个元素有且只有一个直接前驱元素;除最后一个元素外,每个元素有且只有一个直接后驱。一对一的对应关系。基本操作: InitList(*L): 初始化操作,建立一个空列表L。原创 2017-05-01 16:39:52 · 802 阅读 · 0 评论 -
KMP算法
1.原始的字符串匹配方法算法基本思想:从主串S的第pos个字符起和模式的第一个字符比较之,若相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式的字符比较之。依次类推,直至模式T中的每个字符依次和主串S中的一个连续的字符序列相等,则称匹配成功,否则称匹配不成功。这种匹配方法理解起来很简单,中心思想就是逐个比较字符,每当一趟匹配过程中出现字符不等时,主串的比较指针i需要回溯。时原创 2017-05-20 08:32:40 · 712 阅读 · 0 评论 -
一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。输入样例:4 3 4 -5 2原创 2017-05-09 13:45:07 · 1084 阅读 · 1 评论 -
树
1.基本概念树:是n(n>=0)个结点的有限集。在任意一颗非空树种:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2....Tn,其中每一个集合本身又是一棵树,并且称为根的子树。度:结点拥有的子树数原创 2017-05-25 12:28:03 · 508 阅读 · 0 评论 -
树、森林与二叉树的转换及遍历
1.树、森林与二叉树的转换前面介绍的孩子兄弟存储结构可以将树转换为二叉树。这样我们就可以使用二叉树的算法来解决普通树的问题。1.树转换为二叉树将树转换为二叉树的步骤如下: 1. 加线。在所有相邻的兄弟结点之间加一条线。 2. 去线。对树中的每个结点。只保留它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。 3. 层次调整。原来结点第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点原创 2017-06-20 15:59:53 · 3841 阅读 · 1 评论 -
二叉树及其遍历(递归和非递归实现)
1.基本概念二叉树:一种特殊的树形结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。二叉树的五种形态:空二叉树、只有一个根结点、根节点只有左子树、根节点只有右子树、根节点既有左子树又有右子树。特殊二叉树:斜树(所有结点只有左子树的二叉树叫左斜树,所有结点只有右子树的二叉树叫右斜树,与线性表结构类似)满二叉树(所有分支结点原创 2017-05-30 09:19:17 · 899 阅读 · 0 评论 -
线索二叉树
1.基本概念对于某些二叉树而言,其指针域的空间不能被充分利用。因此我们可以考虑利用那些空的指针域来存放指向结点在某种遍历次序下的前驱和后继结点的地址。我们把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,对应的二叉树就称为线索二叉树。 我们对二叉树以某种次序遍历使其变为线索二叉树的过程称作是线索化。线索化的过程就是在遍历二叉树时修改结点空指针的过程。2.线索二叉树的存储结构为区别原创 2017-06-08 20:07:38 · 1570 阅读 · 2 评论 -
冒泡排序
学习之后,自己练习手写一下排序算法,加深印象原理:顾名思义,此种算法排序的数字像气泡一样,一个个往上浮。两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止#define MAXSIZE 10#include <stdio.h>struct a{ int array[MAXSIZE]; int length;};void init_ar...原创 2018-03-16 21:39:53 · 346 阅读 · 0 评论 -
简单选择排序
学习之后,自己练习手写一下排序算法,加深印象原理:通过n-i次关键词的比较,从n-i+1个记录中选出关键词最小的记录,并和第i(1<=i<=n)个记录交换之。与冒泡排序相比,其交换的次数减少了许多。#define MAXSIZE 10#include <stdio.h>struct a{ int array[MAXSIZE]; //数组用于存储...原创 2018-03-17 13:20:21 · 335 阅读 · 0 评论 -
直接插入排序
学习之后,自己练习手写一下排序算法,加深印象原理:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录增1的有序表。在插入过程中,需要与有序表中的数依次比较大小,从而找到新记录的插入位置。#define MAXSIZE 10#include <stdio.h>struct a{ int array[MAXSIZE]; //数组用于存储排序数据 ...原创 2018-03-18 14:41:04 · 358 阅读 · 0 评论 -
堆排序
学习之后,自己练习手写一下排序算法,加深印象原理:将待排序n个元素的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它与堆末尾的元素交换后,移除。然后将剩下n-1个元素的序列重新构造成一个堆,这样就会得到这n-1个元素中最大值。如此反复交换根结点和构建新的堆,便能得到一个有序序列。堆排序用到了完全二叉树的概念和性质,参见我的笔记https://blog.youkuaiyun.com/z...原创 2018-03-24 09:59:02 · 409 阅读 · 0 评论 -
关键路径JS实现
我勒个去,毕业论文终于提交了,赶紧完成图基本算法的最后一节。。。1 定义在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,称为AOE网。AOE网中没有入边的顶点称为始点或源点,没有出边的顶点称为终点或汇点。由于一个工程通常总有一个开始和一个结束,因此AOE网只有一个源点和汇点。与AOV网区别在于,AOV网是顶点表示活动...原创 2019-01-09 16:00:00 · 1429 阅读 · 2 评论