数据结构
猜不到我是谁
这个作者很懒,什么都没留下…
展开
-
javascript 哈希表
基本概念:哈希表(hash table )是一种根据关键字直接访问内存存储位置的数据结构,通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数。哈希表的构造方法:假设要存储的数据元素个数是n,设置一个长度为m(m > n)的连续存储单元,分别以每个数据元素的关键字Ki(0<=i<=n-1)为自变量,通过哈希函数hash...转载 2020-02-18 15:18:54 · 1134 阅读 · 0 评论 -
js实现最大堆
有两个原始操作用于保证插入或删除节点以后堆是一个有效的最大堆或者最小堆:shiftUp(): 如果一个节点比它的父节点大(最大堆)或者小(最小堆),那么需要将它同父节点交换位置。这样是这个节点在数组的位置上升。shiftDown(): 如果一个节点比它的子节点小(最大堆)或者大(最小堆),那么需要将它向下移动。这个操作也称作“堆化(heapify)”。shiftUp 或者 shiftDo...原创 2020-02-16 15:30:05 · 1112 阅读 · 0 评论 -
JS实现合并多个有序数组
合并两个有序数组:给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。(leetCode88)说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。/** * @param {number[]} n...原创 2019-11-07 12:19:55 · 1297 阅读 · 0 评论 -
JS实现两个链表的第一个公共结点
分析:首先要理解什么是公共节点,并不是两个节点的值相同就是公共节点。而是在第一链表和第二链表中都存在一个节点,该节点往后的子链表在两个链表中是相同的。方法一最直观就是暴力法,在第一链表上顺序遍历每个节点,每遍历到一个节点,就在第二个链表上顺序遍历每个节点。如果在第二个链表上有一个节点和第一个链表上的节点一样,则说明两个链表在这个节点上重合,但是这种方法的复杂度为O(m * nm∗n)(第一...原创 2019-11-06 09:52:27 · 475 阅读 · 0 评论 -
js实现二叉查找树的建立、插入、删除、遍历操作
概念二叉排序树(二叉查找树),它或者是一颗空树,或者是具有以下性质的二叉树:任意一个结点左子树上的所有结点值均小于该结点值任意一个结点右子树上的所有结点值均大于该结点值例如下图:插入和建立二叉排序树结点的数据结构function newNode(value){ this.value = value; this.left = null; this.righ...原创 2019-11-05 23:50:14 · 601 阅读 · 1 评论 -
关于二叉树的前序、中序、后序三种遍历
二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。为啥叫这个名字?是根据根节点的顺序命名的。比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC(先左后根最后右);后序顺序是BCA(先左后右最后根)。比如上图二叉树遍历结果前序遍历:ABCDEFGHK中序遍历:BDCAEHGKF后序遍历:DCBH...转载 2019-11-05 23:14:55 · 170 阅读 · 0 评论 -
经典九大排序
九大排序排序是数据结构体系中最重要的内容之一,这一块必须要非常熟练的掌握,应该做到可以立马写出每个排序的代码,有多种实现方法的必须多种都能很快写出来,当然对各个排序的性能的了解也是基础且重要的。我们先对排序这一块进行一个整体的把握。内排序:在对待排序数据存放在内存中进行的排序过程。外排序:待排数据量太大,无法一次性将所有待排序数据放入内存中,在排序过程中需要对磁盘等外部储存器进行访问。比...原创 2019-10-23 16:35:16 · 553 阅读 · 1 评论 -
链栈的JS实现
官方定义:链式栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。function LinkStack() { this.length = 0; this.top = null;//栈顶指针 };LinkStack.prototype.Node = fu...转载 2019-10-13 12:00:57 · 253 阅读 · 0 评论 -
大话数据结构----总结一
1.逻辑结构与物理结构按照视点的不同,我们把数据结构分为逻辑结构和物理结构。逻辑结构:逻辑结构是指数据对象中数据元素之间的相互关系。逻辑结构分为以下四种:集合结构:集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。各个数据元素是“平等的”,它们的共同属性是“同属于一个集合”。线性结构:线性结构中的数据元素之间是一对一的关系。树形结构:树形结构中的数据元素存在一种一对...原创 2019-10-13 09:49:14 · 449 阅读 · 0 评论 -
JS实现最短路径之迪杰斯特拉(Dijkstra)算法
最短路径: 对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点 迪杰斯特拉 ( Dijkstra) 算法是并不是一下子就求出 了 Vo 到V8 的最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最短路径的基础上,求得更远顶点的最短路径,最终得到你要的结果//定义邻接矩阵let Arr2 = [...转载 2019-09-28 12:26:57 · 922 阅读 · 1 评论 -
最小生成树-普里姆(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 = []; ...转载 2019-09-28 10:05:42 · 384 阅读 · 0 评论 -
马踏棋盘
本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题。分享给大家供大家参考,具体如下:问题将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案。分析每到一格,就有[(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1)]顺时针8个...转载 2019-09-26 17:04:51 · 497 阅读 · 0 评论 -
JS实现哈夫曼数
function Huffman(str) { // 需要编码的字符串 this.str = str; // 键和频率映射表 this.keyCountMap = null; // 编码和键的映射表 this.codeKeyMap = {}; // 键和编码的映射表 this.keyCodeMap = {}; // 哈夫曼树节点列表 this.nodeLis...转载 2019-09-25 14:10:16 · 259 阅读 · 0 评论 -
JS中的算法与数据结构——链表(Linked-list)
要存储多个元素,数组(或列表)可能是最常用的数据结构。但这种数据结构有一个缺点:(在大多数语言中)数据的大小是固定的,从数组的起点或中间插入或移除项的成本很高。链表存储有序的集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。相对于传统的数组,链表的一个好处是,添加或移除元素的时候不需要移动其他元素。然而,...原创 2019-09-17 11:28:59 · 180 阅读 · 0 评论 -
JS实现约瑟夫环
传说罗马人占领了乔塔帕特,41 个犹太人被围堵在一个山洞里。他们拒绝被俘虏,而决定集体自杀,大家决定了一个自杀方案,41 个人围成一个圈,由第 1 个人开始顺时针报数,每报数为 3 的人立刻自杀,然后再由下一个人重新从 1 开始报数,依旧是每报数为 3 的人立刻自杀,依次循环下去。其中两位犹太人并不想自杀,是数学家约瑟夫和他的朋友,他们发现了自杀方案的规律,选了两个特定的位置,最后只剩下他们两人,...原创 2019-09-18 18:44:20 · 2658 阅读 · 0 评论 -
JS中的算法与数据结构——栈
栈,又叫堆栈,是和列表类似的一种数据结构,但是却更高效,因为栈内的元素只能通过列表的一端访问,称为栈顶,数据只能在栈顶添加或删除,遵循 先入后出(LIFO,last-in-first-out) 的原则,普遍运用于计算机的方方面面。对栈的操作主要有两种,一是将一个元素压入栈,push方法,另一个就是将栈顶元素出栈,pop方法。除此之外,栈还有其他的一些属性和方法:查看当前栈顶的元素值,我们使用 ...原创 2019-09-20 15:59:20 · 226 阅读 · 1 评论 -
JS实现逆波兰表达式
常见的算术表达式,称为中缀表达式,例如:5 + ( 6 – 4 / 2 ) * 3波兰表达式也称为前缀表达式,以上面的例子为例,其波兰表达式为:+ 5 * - 6 / 4 2 3波兰表达式中缀表达式转换前缀表达式的操作过程为:(1)首先设定一个操作符栈,从右到左顺序扫描整个中缀表达式:如果是操作数,则直接归入前缀表达式;如果是括号:如果是右括号,则直接将其入栈;如果是左括号,...原创 2019-09-20 18:55:53 · 980 阅读 · 0 评论 -
JS实现队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。f...原创 2019-09-23 10:19:34 · 194 阅读 · 0 评论 -
JS实现汉诺塔问题
汉诺塔是一道经典的递归编程的经典题题目要求:汉诺塔问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔A上的碟子移动到塔C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们...原创 2019-09-23 11:05:38 · 1260 阅读 · 0 评论 -
JS实现八皇后问题
背景八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为 n×n ,而皇后个数也变成n 。当且仅当n = 1或n ≥ 4时问题有解。盲目的枚举算法通过N重循环,枚举满足约束条件的解(八重循环...转载 2019-09-23 12:55:23 · 1008 阅读 · 0 评论 -
JS实现KMP算法
KMP算法和BM算法KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同。前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右。KMPKMP也是一种优化版的前缀算法,之所以叫KMP就是Knuth、Morris、Pratt三个人名的缩写,对比下BF那么KMP的算法的...转载 2019-09-24 18:18:42 · 1294 阅读 · 0 评论 -
数据结构----树及二叉树的遍历JS
树:一种非顺序数据结构-树,它对于存储需要快速查找的数据非常有用。相关概念:根节点:位于树顶部的节点,没有父节点;内部节点:至少有一个子节点的节点(7,5,9,15,13,20);外部节点(叶节点):没有子元素的节点(第3层);子树:由节点和它的后代构成(节点13,12,14构成了一个子树);深度:节点的深度取决于它的祖先节点的数量;高度:取决于所有节点深度的最大值。二叉树...原创 2019-09-25 11:53:52 · 605 阅读 · 0 评论 -
线索二叉树JS
线索二叉树当用二叉链表来存储二叉树时,每次只能找到左右孩子的信息,不能直接找到其前驱和后继结点的信息。线索二叉树就解决了这个问题。结点结构图:LChild Ltag Data Rtag RChildA.如果有左孩子,则LChild继续指向左孩子,否则,指向该结点的前驱结点。B.如果有右孩子,则RChild继续指向右孩子,否则,指向该结点的后继结点。Ltag 用来标记是 左孩...原创 2019-09-25 11:54:17 · 258 阅读 · 0 评论 -
JS中的算法与数据结构——链表(Linked-list)
@TOC链表(Linked-list)数组不总是最佳的数据结构,因为,在很多编程语言中,数组的长度都是固定的,如果数组已被数据填满,再要加入新的元素是非常困难的。而且,对于数组的删除和添加操作,通常需要将数组中的其他元素向前或者向后平移,这些操作也是十分繁琐的。然而,JS中数组却不存在上述问题,主要是因为他们被实现了成了对象,但是与其他语言相比(比如C或Java),那么它的效率会低很多。这...转载 2019-07-28 16:38:21 · 317 阅读 · 0 评论