
数据结构javascript
布瑞泽的童话
这个作者很懒,什么都没留下…
展开
-
选择排序javascript
简单选择排序是人们最熟悉的比较方式,其算法思想为:从数组的开头开始,将第一个元素和其他元素进行比较。检查完所有元素后,最小的元素会被放到数组的第一个位置,然后算法会从第二个位置继续。这个过程会一直进行,当进行到数组的倒数第二个位置时,所有的数据便完成了排序。 代码如下: function selectSort(nums){//选原创 2015-05-28 19:08:08 · 1168 阅读 · 0 评论 -
最小生成树
假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时,自然会考虑一个问题,就是如何在最节省经费的前提下建立这个通信网。类似此类的问题很多,比如煤气管道问题等,这些问题都等价于,在含有n个顶点的连通网中,选择n-1条边,构成一颗极小的连通子图,并使该连通子图中n-1条边上的权值达到最小,则称该子图为连通网的最小生成树。 有两种常用算法,分别是克鲁斯卡尔(Kru原创 2015-05-25 15:15:21 · 1660 阅读 · 1 评论 -
图的搜索算法javascript
搜索就是从一个指定的点开始找到其他节点。图的搜索基本上分为深度优先搜索和广度优先搜索。先来说说深度优先搜索。 深度优先搜索包括从一条路径的起始顶点开始追溯,直到到达最后一个顶点,然后回溯,继续追溯下一条路径,直到到达最后的顶点,如此往复,直到没有路径为止。如下图所示:算法的思路就是访问一个没有访问过的点,将它标记为已访问,再递归去访问在初始顶点的邻接表中其他没有访问过原创 2015-05-22 21:30:41 · 2636 阅读 · 0 评论 -
拓扑排序
拓扑排序是由某个集合上的一个偏序得到该集合上的一个全序,这个操作称为拓扑排序。偏序和全序的概率我们不作了解。其实就和工作流一样,有个优先级的问题,就是后面的节点需要前面节点的支持。举个简单例子如下:左图为偏序,右图为全序。下面说说拓扑排序的思路,其实和深度优先搜索类似。不同的是,拓扑排序算法不会立即输出已访问的顶点,而是访问当前顶点邻接表中的所有相邻顶点,直到这个列表穷尽时原创 2015-05-25 20:28:37 · 1487 阅读 · 1 评论 -
图的最短路径javascript
图中一个结点到另一个结点的最短路径,可以应用到很多现实问题上来。在执行广度优先搜索时,会自动查找从一个顶点到另一个相连顶点的最短路径。例如,查找a到d的最短路径,首先会查找从a到d是否有一条单边路径,接着查找两条边的路径,以此类推。所以在原有的基础上,我们需要一个数组来保存从一个顶点到下一个顶点的所有边。命名为edgeTo。新的广度优先搜索代码如下: function bfs(s){//广原创 2015-05-25 15:13:26 · 3628 阅读 · 0 评论 -
图的表示javascript
乍一看,图和树或者二叉树很像,但是采用基于对象的方式来构建就会有问题,因为图可能会增长到非常大,用对象来表示就会使效率低下。 首先我们需要定义一个图的类,其中通过adj数组来表示邻接表,也就是与节点相关联的节点数组;marked数组则是用来表示该节点是否被访问过,是在深度优先搜索和广度优先搜索中用到的。 function Graph(v){//图类 this.vert原创 2015-05-21 01:20:20 · 982 阅读 · 0 评论 -
折半查找javascript
折半查找也叫做二分查找,是针对有序表的一种查找方式,其思想如下: 将数组的第一个位置设为下边界; 将数组的最后一个位置设为上边界; 如果下边界等于或小于上边界,则做如下操作: 将中点设置为上边界加下边界之和除以二; 如果中点的元素小于查询的值,则将下边界设置为原创 2015-05-26 15:51:20 · 1762 阅读 · 0 评论 -
图的存储结构
本文讲解了图的基本概念和图的四种存储方式。原创 2015-05-20 10:03:37 · 1266 阅读 · 2 评论 -
二叉树的计数javascript
二叉查找树的一个用途就是记录一组数据集中数据出现的次数。比如记录成绩的分布,给定一组考试成绩,如果未出现则加入树,如果已经出现则数量加一。 所以要修改Node对象,添加记录成绩出现次数加一,代码如下:function Node(data,left,right){ this.data=data; this.left=left; this.right=right;原创 2015-05-18 22:18:29 · 1054 阅读 · 0 评论 -
顺序查找javascript
对于查找数据来说,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果。这个方法叫做顺序查找,有时候也被叫做线性查找。它属于暴力查找技巧的一种。顺序查找实现起来非常简单,代码如下: function generalSearch(arr,data){//普通的顺序查找,就是遍历一遍看是否找到 for(var i=0;i<arr.length;i++){原创 2015-05-26 15:41:28 · 1240 阅读 · 1 评论 -
关键路径
这里首先要介绍一下AOE网,在一个表示工程的带权有向图中,用顶点表示事件,用有向边表示活动,边上的权值表示活动的持续时间,称这样的有向图叫做边表示活动的网,简称AOE网。AOE网中从始点到终点的最大路径长度,就是关键路径。所以说关键路径是整个工程所需的最短工期。示例如下:关键路径如下:原创 2015-05-26 15:38:09 · 1099 阅读 · 0 评论 -
初始队列
和上一节介绍的栈相反,队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端进行删除。javascript自己提供了两个队列方法shift和unshift方法,分别是入队和出队,其原理就是将元素插入数组最后一个和删除第一个元素。 这里需要注意一点,就是shift方法的效率比pop的效率要低很多。因为它要将出队之后的数组全部往前移动一位。这里我们就不用代码再次演示了。原创 2015-05-13 22:32:44 · 797 阅读 · 0 评论 -
堆排序
堆排序只需要一个记录大小的辅助空间,每个待排序的记录仅占用一个存储空间。堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得当前无序区中选取最大(或最小)关键字的记录变得简单。我们以大跟堆为例子,排序的基本操作如下: 首先是建堆,建堆就是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从l原创 2015-05-28 19:10:34 · 1792 阅读 · 0 评论 -
归并排序
归并是将两个或两个以上的有序表组合成一个新的有序表。一个序列有n个记录,则可以看成是n个有序的子序列,两两归并。在实际应用中,归并排序还有一些问题,当我们用这个算法对一个很大的数据集进行排序时,我们需要相当大的空间来合并存储两个子数组。 通常来讲,归并排序会采用递归的算法来实现,但是在javascript中不太好,因为这个算法的递归深度太深了。所以我们介绍一种非递归的方法,称为原创 2015-05-28 19:10:55 · 866 阅读 · 0 评论 -
快速排序javascript
首先要介绍一下冒泡排序,冒泡排序的过程很简单,首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个关键字交换,然后比较第二个和第三个,直到最后一个比较完成。这是第一趟冒泡,其结果使得关键字最大的记录被安置到最后一个位置上了。然后对序列前n-1个元素进行第二次冒泡,将倒数第二个选出。以此类推直到所有被选出,冒泡结束。 通过分析可以得出,冒泡排序的时间复杂度为O原创 2015-05-28 12:38:16 · 1332 阅读 · 0 评论 -
插入排序javascript
根据排序过程中使用的存储器不同,可以将排序方法分为两大类:内部排序和外部排序。内部排序是指待排序记录存放在计算机随机存储器中进行的排序过程;外部排序指的是待排序的记录数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。 下面介绍几种常见的内部排序方式:插入排序 插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入已排好序原创 2015-05-27 08:26:26 · 1315 阅读 · 0 评论 -
广义表的表示javascript
广义表是线性表的推广,也有人称其为列表。 那么它和线性表有什么区别呢?线性表中每个成员只能是单个元素,而广义表中的成员可以是单个元素,也可以是广义表,分别称为广义表的原子和子表。下面举几个广义表的例子。A=();B=(e);C=(a,(b,c,d));D=((),(e),(a,(b,c,d)));E=(a,E);由于广义表中的数据元素可以具有不同的结构(原子或列原创 2015-05-15 19:41:57 · 1853 阅读 · 0 评论 -
B树,B+树,B*树
B树 B树,也叫B-树,就是B-Tree(BalanceTree),是一种多路搜索树,它在文件系统中很有用,它不是二叉树,而是m(m>=3)叉树,具有以下特征: 树中每个节点至多有m个结点; 根节点子树个数在2---m; 非根节点子树个数在 m/2(m向上取整)-----m 排列规则:所有叶节点在同一层,按照递增次原创 2015-05-26 16:09:57 · 1105 阅读 · 0 评论 -
平衡二叉树
该二叉树具有以下特征:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将左子树上的结点的平衡因子BF定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只可能是-1,0和1。下图中前两个为平衡二叉树,后两个不平衡:以前关于树的部分我讲到了二叉排序树,我们希望由任何序列构成的二叉排序树都是平衡树,因为平衡树上任意结点的左右子原创 2015-05-26 15:59:09 · 886 阅读 · 0 评论 -
哈夫曼树
最优二叉树,又称为赫夫曼树,是一类带权路径长度最短的树。 下面介绍一下基本概念,从树中的一个结点到另外一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称为路径长度。树的路径长度是从树根到每一个结点的路径长度之和。树的带权路径长度为树中所有叶子结点的带权路径长度之和。其中带权路径长度最小的二叉树·称作最优二叉树或赫夫曼树。 举个例子,下图三个二叉树原创 2015-05-18 22:22:08 · 942 阅读 · 0 评论 -
二叉树的删除javascript
从二叉查找树上删除节点的操作复杂程度取决于删除哪个节点。如果删除没有子节点的节点就非常简单,如果节点只有一个子节点,不管是左子节点还是右子节点,就变得稍微有点复杂,如果节点包含两个子节点就最复杂。 如果待删除节点是叶子节点,那么只需要将从父节点指向它的链接指向null。 如果待删除节点只包含一个子节点,那么原本指向它的节点就得使其指向它的子节点。原创 2015-05-17 18:51:36 · 1488 阅读 · 0 评论 -
二叉树的遍历javascript
三种遍历的代码:function inOrder(node){//中序遍历 if(node!=null){ inOrder(node.left); document.write(node.show()+" "); inOrder(node.right); } } function preOrder(node){//先序遍历 if(node!=null){原创 2015-05-17 18:45:06 · 1412 阅读 · 0 评论 -
javascript队列的应用
队列的应用有哪些呢? 我们先看看计算机组成层面的吧,首先就是CPU资源的竞争问题。在具有多个终端的计算机系统中,有多个用户需要使用CPU来各自运行程序,操作系统会按照每个请求在时间上的顺序,加请求排成一个队列。每次把CPU分配给队头的任务,完成后使其出队,然后依次。 第二个例子就是主机与外部设备之间速度不匹配的问题。我们以打印机和主机为例。主机输出数据给打印原创 2015-05-13 22:35:27 · 1011 阅读 · 0 评论 -
javascript栈的应用之表达式求值后篇
好了,那么我们将中缀表达式转化为后缀表达式后,如何继续计算呢?还是以这个例子为例。 中缀表达式:a*b+c*d-e/f 后缀表达式:ab*cd*+ef/- 基本思路如下: 遍历后缀表达式,遇到非操作符的字符则直接进栈,遇到操作符则出栈两个元素,进行对应操作,然后将得到的结果再次入栈。依次直到遍历完成,此处栈中保存的值就是当前表原创 2015-05-12 23:41:43 · 704 阅读 · 0 评论 -
javascript栈的应用之表达式求值
下面来谈一个比较经典的表达式求值问题,这个问题主要是设计到操作符的优先级。我们通常看到的表达式都是中缀表达式,存在很多优先级差别,而后缀表达式则没有这些优先级问题。下面先看看两种表达式的区别。 中缀表达式:a*b+c*d-e/f 后缀表达式:ab*cd*+ef/- 从中缀表达式转换到后缀表示式是很难实现的,我们这里可以通过栈的思想原创 2015-05-12 23:31:59 · 1394 阅读 · 0 评论 -
栈的实现javascript
栈是限定仅在表尾进行插入或删除操作的线性表,栈是先进后出的。栈的表尾称为栈顶(top),而表头端称为栈底(bottom)。 和线性表类似,栈也有两种存储表示方法,顺序栈和链栈。 这里讲一下顺序栈,设置指针top指示栈顶元素在顺序栈中的位置。通常的做法就是以top=0表示空栈。base为栈底指针,top为栈顶指针。如果base为null,则表示栈结构不存在原创 2015-05-11 21:33:45 · 1025 阅读 · 0 评论 -
javascript栈的应用之符号平衡
由于栈先进后出的结构,我们可以将其作为有用的工具,下面就介绍一下栈的应用。首先是符号的平衡问题。有一串字符串,我们需要判断其中固定的字符是否成对出现,比如实现上述算法的javascript代码如下 function isbalance(str){ var str=str.toString(), len=str.length原创 2015-05-11 21:41:38 · 673 阅读 · 0 评论 -
线性表的顺序表示
线性表的顺序表示指的是用一组地址连接的存储单元依次存储线性表的数据元素。通常称这种存储结构的线性表为顺序表。 顺序表的特点是以元素在计算机内物理位置相邻来表示数据元素之间的逻辑关系。每一个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。也就是说只要确定了存储线性表的起始位置,线性表中的任一元素都可以随机存储,所以说,顺序表是一种随机存取的存原创 2015-05-09 17:48:35 · 1012 阅读 · 0 评论 -
初识线性表
线性表: n个数据元素的有限序列。比如(A,B,C,D)就是一个线性表。 在复杂的线性表中,一个数据元素可以由多个数据项组成,数据项的概率在上一节的基本概率中有所介绍,这里就不再提了。在这种情况下。常把数据元素称为记录,含有大量记录的线性表又称为文件。 这里举例一个算法题目,给出两个集合A和B。要求得出A=AUB。也就是说,要将存在于B中而不存在于原创 2015-05-08 19:43:36 · 644 阅读 · 0 评论 -
初识串
串是由零个或多个字符组成的有限序列。串中字符的个数称为串的长度。串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串相应地称为主串。通常称字符在序列中的序号为该字符在串中的位置。子串的首字符在主串中首次出现的位置定义为子串在主串中的位置。串的逻辑结构和线性表十分相似,区别仅仅在于串的数据对象约束为字符集。然而两者的基本操作有很大差别。线性表中,基本以单个元素来进行操作;而串中多半以原创 2015-05-13 22:36:43 · 722 阅读 · 0 评论 -
串的表示和实现javascript
类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。下面我们以串联接为例,讲解一下这种存储结构时串的操作。javascript自带有concat方法,该方法返回字符串值,该值包含了两个或多个提供的字符串的连接。 其实思路很简单,就是将第二个串拼接在第一个串后面,代码如下 function Concat(a,b原创 2015-05-13 22:41:32 · 922 阅读 · 0 评论 -
希尔排序javascript
通过对直接插入排序的分析,可知其时间复杂度为O(n2),但是,如果待排序序列为正序时,其时间复杂度可提高至O(n)。希尔排序正是对此进行改进的排序。希尔排序的核心理念与插入排序不同,它会首先比较距离较远的元素,而非相邻元素。通过定义一个间隔序列来表示在排序过程中进行比较的元素之间有多远的间隔。 下图演示了希尔排序中间隔序列是如何运行的: 下面我们通过js来实现希原创 2015-05-27 08:26:58 · 2090 阅读 · 0 评论 -
键树
键树又称为数字查找树,它是一颗度大于等于2的树,树中的每个结点中不是包含一个或几个关键字,而是只含有组成关键字的符号。例如,若关键字为数值,则结点中只包含一个数位;若关键字为单词,则结点中只包含一个字母字符。这种树会给某种类型关键字的表的查找带来方便。 我们来举一个例子吧,下面有一个集合:{CAI,CAO,LI,LAN,CHA,CHANG,WEN,CHAO,YUN,YANG,原创 2015-05-27 08:02:49 · 4050 阅读 · 0 评论 -
二叉查找树的表示javascript
树是一种非线性的数据结构,以分层的方式存储数据。树被用来存储具有层级关系的数据,比如文件系统中的文件;树还被用来存储有序列表。这里将研究一种特殊的树:二叉树。选择树而不是那些基本的数据结构,是因为在二叉树上进行查找非常快(而在链表上查找则不是这样),为二叉树添加或删除元素也非常快(而对数组执行添加或删除操作则不是这样)。树是n个结点的有限集。最上面的为根,下面为根的子树。树的节点包含一个数据元原创 2015-05-17 18:41:23 · 888 阅读 · 0 评论 -
哈希表
哈希表(HashTable)也叫散列表,是根据关键码值(KeyValue)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就叫做散列函数,存放记录的数组叫做散列表。散列存储的基本思路就是以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中。原创 2015-05-27 08:15:41 · 1063 阅读 · 1 评论 -
写在前面的话
由于即将开展数据结构的进一步巩固学习,所以开通了个人的第一个博客。以前的自己,都是将笔记记录在文档中,这样便于搜索和修改。而这一次,选择了公诸于众。不是自夸自擂,而是为了将自己在项目中遇到的各种问题,自己的学习中收获的一些心得体会,拿到桌面上来和大家一起体会,一起分享!原创 2015-05-08 14:54:27 · 475 阅读 · 0 评论 -
线性表的链式表示
从上一节可以,顺序存储结构的弱点就是在插入或删除操作时,需要移动大量元素。所以这里需要介绍一下链式存储结构,由于它不要求逻辑上相邻的元素在物理位置上也相邻,所以它没有顺序存储结构的弱点,但是也没有顺序表可随机存取的优点。 下面介绍一下什么是链表。 线性表的链式存储结构用一组任意的存储单元存储线性表的数据元素。所以,每一个数据元素除了存储自身的信息之外,还需要原创 2015-05-09 17:56:56 · 1268 阅读 · 0 评论 -
二叉树的查找javascript
现在谈谈在二叉树中进行查找。对二叉查找树来说,一般有以下三类查找:最大值,最小值和给定值。 查找最小值就是遍历左子树,直到找到最后一个结点,这是因为在二叉查找树中较小的值总是在左子节点上的。 代码如下:function getMin(){//查找最小值 var current=this.root;//指向根节点 while(current.left!原创 2015-05-17 18:49:22 · 1003 阅读 · 0 评论 -
数组的表示javascript
数组类似于线性表。基本上每种语言都会讲数组作为固有类型。这里主要讲一下二维数组。我们可以把二维数组看成这样一个定长线性表:它的每个数据元素也是一个定长的线性表。数组一旦被定义,它的维数和维界就不再改变。因此,除了结构的初始化和销毁之外,数组只有存取元素和修改元素值的操作(这里注意和javascript中的array类型做出区分,这里说的是数据结构,而不是某一种单独语言的语法)。由于数组一般原创 2015-05-15 19:35:23 · 1024 阅读 · 0 评论 -
基本概念
数据:信息的载体,能被计算机识别、存储和加工处理。 数据元素:数据的基本单位,可由若干个数据项组成,数据项是数据的不可分割的最小单位。比如一本书中的书目信息是数据元素,则书名、作者等具体信息就是数据项。数据结构:数据之间的相互关系,即数据的组织形式。通常有下列四列基本结构: 集合:结构中的数据元素之间除了同属于一个集合之外,没有其他关系; 线原创 2015-05-08 17:52:16 · 655 阅读 · 0 评论