算法
Wonder233
这个作者很懒,什么都没留下…
展开
-
【用JavaScript学算法】最小可用ID
假设我们是用非负整数作为某个系统的ID,所有用户都由一个ID唯一确定。任何时间,这个系统中的有些ID处于使用中的状态,有些ID则可以分配给新用户。问题是,怎样才能找到最小的可分配ID呢? 样例输入:[18, 4, 8, 9, 16, 1, 14, 7, 19, 3, 0, 5, 2, 11, 6] 样例输出:10暴力解决算法时间复杂度O(n^2)var notBelong = function原创 2017-11-01 09:45:05 · 530 阅读 · 0 评论 -
【查找】顺序表(线性表)查找
最基本的查找技术。算法思想从表中第一个(最后一个)记录开始,逐个进行记录的关键字和给定值比较:若某个记录的关键字和给定值相等,则查找成功,找到所查记录;若直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。算法实现function Sequential_Search(a,key){ var i; for(i=0;i< a.length原创 2018-01-29 16:21:27 · 801 阅读 · 0 评论 -
【查找】基本概念与分类
基本概念查找:在数据元素集合中查找是否存在关键字等于某个给定关键字数据元素的过程。 关键字有:主关键字:能够唯一区分各个不同数据元素的关键字。次关键字:通常不能唯一区分各个不同数据元素。分类查找可分为:静态查找:只在数据元素集合中查找是否存在关键字等于某个给定关键字的数据元素。动态查找:除包括静态查找的要求外,还包括在查找过程中同时插入数据元素集合中不存在的数据元素,或者从数据元素集合中原创 2018-01-29 15:59:51 · 517 阅读 · 0 评论 -
【排序】交换排序
定义排序要用到的结构:function List(array){ this.L = array; this.length = array.length;}冒泡排序基本思想两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。算法实现/* 冒泡排序 */List.prototype.BubbleSort = function () { var i, j, tmp原创 2018-01-25 09:36:18 · 799 阅读 · 0 评论 -
【排序】归并排序
归并的思想就是将本是无序的数组序列{16,7,13,10,9,15,3,2,5,8,12,1,11,4,6,14}\{16,7,13,10,9,15,3,2,5,8,12,1,11,4,6,14\}通过两两合并排序后再合并,最终获得一个有序的数组。如下图。基本思想二路归并排序: 假设初始序列含有 nn 个记录,则可以看成是 nn 个有序的子序列,每个子序列的长度为 11 ,然后两两归并,得到 ⌈n原创 2018-01-28 13:21:44 · 363 阅读 · 0 评论 -
【图】最短路径:迪杰斯特拉(Dijkstra)算法
网图和非网图中,最短路径的含义不同:非网图中,因为没有边上的权值,最短路径指的是两顶点之间经过的边数最少的路径;网图中,最短路径指的是两顶点之间经过的边上权值之和最少的路径,并且称路径上的第一个顶点是源点,最后一个顶点是终点。迪杰斯特拉(Dijkstra)算法定义Dijkstra(迪杰斯特拉)算法是单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。特原创 2018-01-19 22:10:55 · 1887 阅读 · 0 评论 -
【图】最小生成树(最小成本):Prim算法
最小成本:nn 个顶点,用 n−1n-1 条边把一个连通图连接起来,并且使得权值的和最小。 最小生成树:构造连通网的最小代价生成树。 根据原来写的博客:【图】图的定义,里面提到一个连通图的生成树是一个极小连通子图,它含有图中全部的顶点,但只有足以构成一棵树的 n−1n-1 条边。找连通网的最小生成树,经典的有两种算法:普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。先给出一个连通网原创 2018-01-18 21:53:01 · 8142 阅读 · 2 评论 -
【图】最小生成树(最小成本):克鲁斯卡尔(Kruskal)算法
给出一个连通网: 克鲁斯卡尔(Kruskal)算法基本思想假设 N=(V,{E})N=(V,\{E\}) 是连通网:令最小生成树的初始状态为只有 nn 个顶点并且没有边的非连通图 T={V,{}}T=\{V,\{\}\} ,图中每个顶点自成一个连通分量。在 EE 中选择代价最小的边,若该边的两个顶点落在 TT 中不同的连通分量上,则将此边加入到 TT 中,否则就舍去此边而选择下一条代价最小的边原创 2018-01-19 11:09:40 · 6479 阅读 · 3 评论 -
【排序】插入排序
基本思想将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个待排序列“基本有序”后,最后在对所有元素进行一次直接插入排序。 希尔排序是对直接插入排序算法的优化和升级。关键采用跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。基本原创 2018-01-25 15:35:51 · 298 阅读 · 0 评论 -
【排序】选择排序
大顶堆:每个节点的值都大于或等于其左右孩子结点的值。 小顶堆:每个节点的值都小于或等于其左右孩子结点的值。 堆是完全二叉树。 若按照层序遍历的方式给结点从 1 开始编号,则结点之间满足如下关系: {ki≥k2iki≥k2i+1或{ki≤k2iki≤k2i+1,1≤i≤⌊n2⌋\begin{cases}k_i\ge k_{2i}\\k_i\ge k_{2i+1}\end{case原创 2018-01-26 17:02:04 · 245 阅读 · 0 评论 -
【二叉树】哈夫曼定理与原理
1、从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径的长度。 2、树的路径长度是从树根到每一结点的路径长度之和。 3、树的带权路径长度(WPL)是树中所有叶子结点的带权路径长度之和。 4、带权路径长度 WPL 最小的二叉树称作哈夫曼树。哈夫曼算法描述根据给定的 nn 个权值 {w1,w2,...,wn}\{w_1,w_2,...,w_n\}原创 2018-01-16 09:38:54 · 763 阅读 · 0 评论 -
【图】深度优先遍历&广度优先遍历
图的遍历:从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。因此,为了避免多次访问某一个定点,需要在遍历过程中把访问过得顶点打上标记。具体办法是设置一个访问数组 visited[n]visited[n],初值为 0,访问过后设置为 1。深度优先遍历(Depth_First_Search)类似树的前序遍历。 步骤:从图中某个顶点 vv 出发,访问此顶点;然后从 vv 的未被访问的邻原创 2018-01-18 17:09:33 · 3180 阅读 · 0 评论 -
【排序】基本概念与分类
定义假设含有 n" role="presentation" style="position: relative;">nnn 个记录的序列为 {r1,r2,...,rn}" role="presentation" style="position: relative;">{r1,r2,...,rn}{r1,r2,...,rn}\{r_1,r_2,...,r_n\},其相应的关键字分别为 {k1,k原创 2018-01-24 15:27:21 · 365 阅读 · 0 评论 -
【图】拓扑排序
定义设 G=(V,{E})G=(V,\{E\}) 是一个具有 nn 个顶点的有向图,VV中的顶点序列 v1,v2,...,vnv_1,v_2,...,v_n 满足若从顶点 viv_i 到 vjv_j 有一条路径,则在顶点序列中顶点 viv_i 必在顶点 vjv_j 之前。则称这样的顶点序列为一个拓扑序列。拓扑排序:对一个有向图构造拓扑序列的过程。 AOV网:在一个表示工程的有向图中,用顶点表示活动原创 2018-01-24 11:13:49 · 292 阅读 · 0 评论 -
【图】最短路径:弗洛伊德(Floyd)算法
特点弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理无向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。基本思想通过 Floyd 算法计算图 G=(V,{E})G=(V,\{E\}) 中各个顶点的最短路径时,需要引入两个矩阵:矩阵 DD 中的元素 a[i][j]a[i][j] ,表示顶点 ii 到顶点 jj 的最短路径权值和。矩阵 PP 中原创 2018-01-24 09:56:06 · 889 阅读 · 0 评论 -
【算法】Sunday算法(模式匹配)
背景Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。相对比较KMP和BM算法而言,简单了许多。原理平均性能的时间复杂度为O(n); 最差情况的时间复杂度为O(n * m)。匹配原理: 从前往后匹配: - 如果遇到不匹配情况判断母串 dest 参与匹配的最后一位的下一位字符,如果该字符出现在模板串 pattern 中,选择最右出现的位置进原创 2018-01-11 18:39:53 · 3721 阅读 · 2 评论 -
【二叉树】根据二叉树的中序遍历和前序遍历,还原二叉树
已知二叉树的前序遍历和中序遍历: PreOrder: 1 2 4 3 5 6 InOrder: 4 2 1 5 3 6 如何还原这颗二叉树,并求出他的后序遍历?原创 2017-11-01 15:46:57 · 683 阅读 · 0 评论 -
【二叉树】统计成绩出现的次数
编程实现二叉搜索树来记录考试成绩的分布。解题: 修改 Node 对象, 为其增加一个记录成绩出现频次的成员。function Node(data,left,right){ this.data = data; this.count = 1; this.left = left; this.right = right;}同时还需要一个方法, 当在 BST 中发现某成绩原创 2017-11-06 11:14:59 · 1052 阅读 · 0 评论 -
【查找】有序表查找
折半查找:原创 2018-01-29 17:22:45 · 512 阅读 · 0 评论