算法第四版
安達と島村
学习记录用,可能有错误的地方
展开
-
js版本b-tree的删除(写得太烂,无法参考)
/*get和put方法见https://blog.csdn.net/weixin_43292547/article/details/104071214,为了测试删除,原本用来测试get和put的代码改了很多。删除用了4个方法,del和delete_和balance和changeK。下面有详细注释。使用这个结构导致删除方法逻辑很麻烦,暂时没找到更好的逻辑。*/let M=100let ...原创 2020-01-23 17:26:36 · 151 阅读 · 0 评论 -
js版本b-tree和抛异常
/*js版本b-tree,采用了每一个"节点"都是数组,数组里是真正的节点,叶子节点保存数据,其他节点保存下一层"节点"的指针。"节点":list:[node1,node2,....]真正的节点:node1:{k:1,v:'v1',list:list1}数组里按k寻找节点使用了二分法,详情见binarySearch的代码js可以使用throw new Error('message')抛异...原创 2020-01-22 17:22:11 · 151 阅读 · 0 评论 -
js版本有负环加权有向图的最短路径bellman-ford算法
/*寻找有负环加权有向图的最短路径,如果顶点能到达负环就不存在最短路径,这是问题转换成找负环如果顶点不能到达负环就找能到达点的最短路径。bellmanFordSP的relax(pq.shift(),G)不能换成relax(pq.pop(),G),否则会变成深度优先搜索,要relax的点可能变多,例如G={0:[[1,0.5],[2,0.5]],1:[[3,0.5]],2:[[3,-0.5]]...原创 2019-12-23 11:31:44 · 246 阅读 · 0 评论 -
js版本无环加权有向图的最短路径算法
function deleteMin(pq){ pq.sort(lengthSort) return pq.shift()}//function lengthSort(a,b){return a[2]<b[2]?-1:1}function lengthSort(a,b){return a[2]-b[2]}//因为dijkstra算法不能出现有向环,这个方法判断是否...原创 2019-12-20 09:04:59 · 468 阅读 · 0 评论 -
图的最短路径的一些截图
充分性的证明:需要理解distTo是个记录某条路径的长度的数组,如distTo[v]表示s到v的某条路径的长度,所以需要证明此数组所有值的取值满足distTo[w]<=distTo[v]+e.weight()时distTo[w]就是e到w最短路径的长度。找到最短路径后对此路径所有点使用distTo[w]<=distTo[v]+e.weight(),叠加计算后可以得出distTo[...原创 2019-12-19 14:37:53 · 157 阅读 · 0 评论 -
js版本图的最短路径的dijkstra算法
function deleteMin(pq){ pq.sort(lengthSort) return pq.shift()}//function lengthSort(a,b){return a[2]<b[2]?-1:1}function lengthSort(a,b){return a[2]-b[2]}//以下帮助测试用的方法//把边[3,2,1.6]改成[...原创 2019-12-19 11:28:02 · 299 阅读 · 0 评论 -
图的最小生成树的一些规定和切分定理的证明和最小生成树的贪心算法的证明的截图
原创 2019-12-17 17:26:22 · 279 阅读 · 0 评论 -
js版本测试图的最小生成树的prim算法和kruskal算法的代码
function deleteMin(pq){ pq.sort(lengthSort) return pq.shift()}//function lengthSort(a,b){return a[2]<b[2]?-1:1} //可以简化成这样function lengthSort(a,b){return a[2]-b[2]}//prim延时实现funct...原创 2019-12-17 16:48:24 · 96 阅读 · 0 评论 -
js版本图的最小生成树的kruskal算法
//(从边有权重开始)pq和mst保存的是边,以前都是保存点//pq应该用优先队列实现,这里取巧用js自带的api了function deleteMin(pq){ pq.sort(randomsort) return pq.shift()}function randomsort(a,b){return a[2]<b[2]?-1:1}function kruska...原创 2019-12-17 15:49:30 · 171 阅读 · 0 评论 -
js版本使用路径压缩的加权quick-union算法/并查集(Union-Find)算法
function connected(i,j,id){ return id[i]==id[j]}//放掉注释可以进一步降低树的高度function find(i,id){ //var list=[i] while(id[i]!=i){ i=id[i] // list.push(i) } //for(let j in ...原创 2019-12-17 13:59:20 · 206 阅读 · 0 评论 -
js版本图的最小生成树的prim算法的即时实现
//最小生成树的prism算法的延时实现//(从边有权重开始)pq和mst保存的是边,以前都是保存点//pq应该用优先队列实现,这里取巧用js自带的api了function deleteMin(pq){ pq.sort(randomsort) return pq.shift()}function randomsort(a,b){return a[2]<b[2]?-...原创 2019-12-17 10:05:49 · 196 阅读 · 0 评论 -
js版本图的最小生成树的prim算法的延时实现
/*最小生成树的prism算法的延时实现标记start并从start开始,把未标记的邻接点之间的边加入优先队列pq,从pq取最短的边,边的两个端点哪个没有被标记,如果这条边上有没被标记的点,就把此边加入mst,标记该点并把该点未标记的邻接点之间的边加入优先队列pq,重复操作直到pq为空。mst即最小生成树。此方法可以不考虑start不能达到的点之间的边。*/let generateGrap...原创 2019-12-17 09:06:21 · 182 阅读 · 0 评论 -
js版本有向图的强连通分量的kosaraju算法
/*强连通分量:如果a可以到达b,b也可以到达a,则a和b是强连通的,它们处于同一个强连通分量里。强连通分量的定义基于点而不是边,一条边的两个点可以在不同的强连通分量里。可以发现所有强连通分量的所有点都在有向环里。*//*先是自己的尝试写,没写出来,代码见dfsSelf;然后根据记忆用拓扑排序写,使用了G的拓扑排序的逆序来对G遍历使用dfs,发现有bug,重新看书最终发现了bug产生的...原创 2019-12-13 17:28:25 · 179 阅读 · 0 评论 -
js版本有向图的DepthFirstOrder访问顺序和拓扑排序
/*对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓...原创 2019-12-13 13:30:12 · 295 阅读 · 0 评论 -
js版本判断有向图是否有环并找出环
//没有自环function dfs(v,G){ //if(hasCycle)return marked[v]=true onStack[v]=true for(let j in G[v]){ //自己写的代码放在最上面,书上放这里,考虑到大部分时间在这个循环里,写这里更快 if(hasCycle)return le...原创 2019-12-13 12:15:41 · 1629 阅读 · 0 评论 -
js版本无向图的判断二分图(双色问题)
/*判断能否给人以一条边的两个端点不同颜色,能就是二分图。如果无环就一定非二分图,有环的情况下,只有某个环的边数是奇数就非二分图。实际代码不是这么写,而是深度优先判断颜色。测试时修改edges测试多种情况。为了方便编码,将大量使用全局变量。*/let generateGraph=require("./graph").generateGraphlet V=10var edges=[[1...原创 2019-12-12 17:06:00 · 332 阅读 · 0 评论 -
js版本判断无向图是否有环并找出环
/*from数组应该被返回,这里为了和最基本的dfs/bfs进行对照,尽量少的修改了代码。*/let generateGraph=require("./graph").generateGraph//let V=10//var edges=[[1,0],[1,3],[3,4],[6,4],[8,1],[7,8],[5,9],[6,8]]let V=1000var edges=[]for...原创 2019-12-12 16:17:36 · 788 阅读 · 0 评论 -
js版本无向图的查找连通分量
let generateGraph=require("./graph").generateGraphlet V=10var edges=[[1,0],[1,3],[3,4],[6,4],[8,1],[7,8],[5,9],[6,8]]console.log(G=generateGraph(V,edges))function getAreasByDFS(V,G){ var ma...原创 2019-12-12 15:14:49 · 204 阅读 · 0 评论 -
js版本图的寻路
/*from数组应该被返回,这里为了和最基本的dfs/bfs进行对照,尽量少的修改了代码。*/let generateGraph=require("./graph").generateGraphlet V=10var edges=[[1,0],[1,3],[3,4],[6,4],[8,1],[7,8],[5,9],[6,8]]console.log(G=generateGraph(V,e...原创 2019-12-12 14:16:12 · 137 阅读 · 0 评论 -
js版本图的深度优先搜索和广度优先搜索
let generateGraph=require("./graph").generateGraphlet V=10var edges=[[1,0],[1,3],[3,4],[6,4],[8,1],[7,8],[5,9]]console.log(G=generateGraph(V,edges))function dfs(v,G){ ////用递归实现的dfs v...原创 2019-12-11 17:32:38 · 186 阅读 · 0 评论 -
js版本基于线性探测的散列表
let getWords=require("./1.js").getWordslet char2int=require("./1.js").char2intwords=getWords(maxcount=50,minlen=1,maxlen=5,R=26)words=Array.from(new Set(words))console.log(words)let M=words.leng...原创 2019-12-11 15:34:21 · 91 阅读 · 0 评论 -
js版本基于链表法的散列表
let getWords=require("./1.js").getWords //导入1.js,代码见字符串部分的文章let char2int=require("./1.js").char2intwords=getWords(maxcount=555,minlen=1,maxlen=5,R=26)words=Array.from(new Set(words)) //去重con...原创 2019-12-11 14:49:32 · 83 阅读 · 0 评论 -
js版本红黑树
/*delete方法有bug,删除完后有时会出现右红链接。有空再改。其他方法暂时没找到bug*/function randomsort(a, b) { return Math.random()>.5 ? -1 : 1 //用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1}var N=10var num=[]for(let i=1;i...原创 2019-12-10 17:10:42 · 103 阅读 · 0 评论 -
js版本二叉查找树
function randomsort(a, b) { return Math.random()>.5 ? -1 : 1 //用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1}var N=10var num=[]for(let i=1;i<1+N;i++){ num.push(i)}let res=JSON.st...原创 2019-12-09 08:35:44 · 71 阅读 · 0 评论 -
js版本5种排序算法
//百度来的随机打乱数组用的函数function randomsort(a, b) { return Math.random()>.5 ? -1 : 1 //用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1}//交换num数组索引a和b的值function ex(num,a,b){ let x=num[a] num[a...原创 2019-12-04 10:29:27 · 217 阅读 · 0 评论 -
js版本LZW压缩算法
/*LZW算法:勉强能理解并写出来,压缩效果只有80%左右,R设置成256压缩率超过1.原因不明可参考https://segmentfault.com/a/1190000011425787压缩:先把单个字符加入tree。然后查找txt[i]开始的最长前缀(长度L),把txt[i:i+L+1](最长前缀再加一位)加入tree,即每次处理完都要往后多取1位,循环此操作;解压:先把单个...原创 2019-11-29 16:51:04 · 1221 阅读 · 0 评论 -
霍夫曼压缩截图纪念
勉强能理解思路,中间的证明太复杂没看。代码写起来太多了,优先队列都要写一个小时,截图保存。前缀码压缩的目的是即能保存成树,和编译表互转时还能不加分隔符。writeTrie时遍历树,走到0说明在非叶子节点,走左再走右,走到1说明在叶子节点,输出字符并返回,因为肯定没有根节点了。readTrie的代码是真的牛逼。如果自己写估计最后一行就写成四行了Node node=new Node(**,*...原创 2019-11-28 15:40:00 · 111 阅读 · 0 评论 -
js版本字符串高位优先排序和类似a =1隐式声明全局变量的坑
//js写的字符串高位排序。遇到3个难题,一个是使用类似test = 5隐式的声明了全局变量,//导致递归提前退出的bug;一个是a[i]=temp_a[i-lo]写成a[i]=temp_a[i];//一个是highSort(a,lo+RS[i],lo+RS[i+1]-1,d+1)写成highSort(a,RS[i],RS[i+1]-1,d+1),//发现了bug的原因(lo和hi的值的传入...原创 2019-11-12 14:48:51 · 107 阅读 · 0 评论 -
js版本三向字符串快速排序
//三向字符串快速排序,类似三向切分排序,lt是等于a[lo]的数组的左边界,gt是右边界let j1=require('./1')let f=j1.char2intlet words=j1.getWords(100,11) //随机生成100个长度在0-10之间的字符串数组var R=26function ex(a,i,j){ let t=a[i] a[i]=a[...原创 2019-11-13 16:18:41 · 157 阅读 · 0 评论 -
js版本单词查找树1.0_null
//单词查找树//生成字母表,下面初始化对象时使用JSON.parse(JSON.stringify(words))来避免地址引用let words={}for(let i=0;i<26;i++){ let c=String.fromCharCode(97+i) words[c]=null}function get(node,key,d=0){ if(n...原创 2019-11-14 11:26:49 · 106 阅读 · 0 评论 -
js版本单词查找树2.0_undefined
//字母表结构和代码大量耦合,不考虑解耦了。//用undefined替换null,对象结构精简很多,getMap不再需要;还有很多代码可以简化,为了与1.0——null进行对照就不改了//在node下获取key对应的val,d是即将比较的字符串的长度,如d=2表示即将用key的第2个字符与树对应的节点进行比较function get(node,key,d=0){ if(node=...原创 2019-11-20 10:34:58 · 115 阅读 · 0 评论 -
js版本三向单词查找树
//三向单词查找树//node结构:{key:"",mid:node,left:node,right:node,val:""}//在node下获取key对应的val,d是即将比较的字符串的索引,如d=2表示即将用key[2]与树对应的节点进行比较,下同function get(node,key,d=0){ if(d>=key.length){return node} i...原创 2019-11-25 08:54:26 · 124 阅读 · 0 评论 -
js版本4个字符串匹配算法KMP_BoyerMoore_RabinKarp_Sunday
//3个字符串匹配算法var j1=require('./1')var char2int=j1.char2intvar R=4 //包含a,b,c,dvar pattern='abababac'var M=pattern.lengthvar txtLength=300var txt=j1....原创 2019-11-26 11:18:06 · 205 阅读 · 0 评论 -
js版本正则表达式的模式匹配
//用正则表达式文本生成有向图function getGraph(re){ let M=re.length let graph=[] for(let i=0;i<=M;i++){graph[i]=[]} let ops=[] for(let i=0;i<M;i++){ let c=re[i] let lef...原创 2019-11-27 16:05:10 · 244 阅读 · 0 评论