算法

链表

June 30, 2020
算法
算法, 链表

数组 # 数组的缺点:数组中添加或删除元素需要将其他元素向前或向后移动, 除了对数据的随机访问,链表几乎可以用在任何可以使用一维数组的情况中。 链表 # 链表是由一组“节点”组成的集合。每个节点都使用一个对象的引用指向它的后继。指向另一个节点的引用叫做“链”。数组元素靠它们的位置进行引用,链表元素则是靠互相之间的关系进行引用。 链表对象 # 节点类:元素内容和后继的引用 1 2 3 4 function Node(element) { this.element = element; this.next = null; } 链表类:表投和一些操作方法 1 2 3 4 5 6 7 function LinkedList() { this.head = new Node("head"); this.find = find; this.insert = insert; this.remove = remove; this.display = display; } 插入元素 # 向一个已知 参考 # 数据结构与算法JavaScript描述.[美]麦克米伦.[译者]王群锋,杜欢.人民邮电出版社.2014-08

深浅拷贝

May 25, 2020
算法

什么是拷贝,什么是深浅拷贝 # 在 JavaScript 中,变量中保存的是对象的引用。比如像下面这样的操作 1 2 var a = 对象1; var b = a; a和b都在引用对象1,如果对对象1进行修改,则a和b两个变量都会受到影响,有时我们不希望出现这种情况,就要对对象进行拷贝操作来切换引用。比如 1 2 var a = 对象1; var b = 拷贝(a); 那么如何实现拷贝呢? 我们知道对象是由多个key和value组成的,所以拷贝就是创建一个新的对象,将旧对象的key和value拷贝到新对象中,让新旧对象的key和value完全一样。比如像下面这样 1 2 3 Object.keys(对象1).forEach(key => { 新对象[key] = 对象1[key]; }) 这样的操作需要注意value的类型,分为基本类型和引用类型1,如果所有的value都是基本类型,但是如果value是引用类型就会出现新旧对象中都引用了一个对象的情况,也就是上文提到的a和b变量的问题。..如果想完全切断引用,就要对引用类型的value在进行一次拷贝..。对于是否需要完全切断引用就有了两种拷贝方式,需要完全切断引用的就是「深拷贝」,不需要的就是「浅拷贝」。 简单概括一下。 「浅拷贝」是只对对象的key和value进行一次遍历拷贝,不管内部的引用。 「深拷贝」要将对象内部的引用完全切断,对对象进行递归地拷贝。 如何实现深拷贝 # 先看一种实现方式 1function clone(旧对象) { 2 var 新对象 = {}; 3 Object.keys(旧对象).forEach(key => { 4 var value = 旧对象[key]; 5 if(is基本类型(value)) { 6 新对象[key] = 旧对象[key]; 7 } else { 8 新对象[key] = clone(value); // 递归 9 } 10 }) 11 return 新对象; 12} 这种方法用的是递归,即当value不是基本类型时就对它进行拷贝。该方法有一个明显的问题,当出现循环引用时,就进入了一个死循环。 ...

开平方

April 3, 2020
算法

计算开平方可以用二分查找来计算。 如:求根号10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 // 用二分查找,精度0.0001 function 二分开根号(x) { var start = 0, end = x,count=1; while (true) { var mid = start + (end - start) / 2; var sq = mid * mid; if (Math.abs(sq - x) < 1e-4) { console.info(mid,count); break; } if (sq < x) { start = mid; } else if (sq > x) { end = mid; } else { console. ...