JS数据结构之BinarySearchTree

原文链接:http://www.gbtags.com/gb/share/5592.htm

之前zhou--hua 分享了一个sort方法的详解,里面介绍了各种sort的方法,我觉得很有意义~一个好的开发还是需要知道一些重要的算法的。所以我就研究了二叉树BinaryTree

BinarySearchTree的好处是处理数据方便,包括插入删除排序查找,都是很优的方法。

我们先来对比一下插入删除排序查找,和其他的算法的复杂度:

1. 插入 ,对于每一个数据的插入来说,他的期望复杂度为O(log n),最差复杂度为O(n)。也就是说,一般他可以达到O(log n)的复杂度。当然,对于只是插入来说,这个复杂度很高,因为仅仅用array.push的复杂度为O(1)。但是这里的插入复杂度高的好处就是:降低了其他功能的复杂度

2.查找,如果要查找某一个数据是否存在,他的期望复杂度为O(log n),最差复杂度为O(n)。对于其他算法,一般对于无序的数组来说,最优解应该就是O(n),对于有序的数组来说,用binary search的复杂度为O(log n)。js内置方法indexOf,我没有找到这个方法的复杂度,但是我猜测应该也是O(n)。

3.排序,第一次排序,其实复杂的普遍认为是add和遍历加在一起,那么排序的复杂度就是O(n(log n)) + O(n) = O(n(log n)). 当add结束后,每次排序的复杂度为O(n),其实对于tree来说,他就是便利了一遍Tree。 对比其他的排序算法,像之前zhou--hua分享的sort文章中列出的几个算法,quickSort, mergeSort这几个常用的算法的复杂度都是O(n(log n)),相对于Tree来说,前面的两个算法的复杂度要高一些。

4.删除,他的期望复杂度为O(log n),最差复杂度为O(n)。相对于我们平时用的js删除方法,用arr.splice(arr.indexOf(item), 1);来比较,如果按照我的猜测indexOf的复杂度为O(n),那么这个东西的复杂度就至少为O(n)。所以,和Tree的删除比较,Tree的方法确实更快一点。

BinarySearchTree的优点

就像上面说的,当数据是无序的时候,插入,删除,排序,查找功能复杂度比较低。使用起来也够方便。

BinarySearchTree的缺点

BinarySearchTree的缺点就是:

1. 所有的数据你必须在刚开始一个一个的添加到tree中,而这个过程的复杂度为O(n(log n)),因为你需要遍历整个数据O(n),然后一个一个加进去O(log n)。

2. 同时用Tree来存储肯定增大了原来的数据占的空间,因为你还需要定义left, right, root这些东西

3. 对于BinarySearchTree是不能有数据重复的。

4.数据最好是无序的,如果拿到的数据是有序的,那么上面的方法用的都是最差复杂度

但是,瑕不掩瑜,如果你写代码的时候,需要处理大量的数据,同时需要用到插入,查找,排序,删除这些功能,那么就推荐使用BinarySearchTree。或者更进一步的其他进阶的Tree,比如AVLTree和RBTree。

github地址: https://github.com/nzakas/computer-science-in-javascript/blob/master/data-structures/binary-search-tree/binary-search-tree.js

下面放上代码对比,为了让时间比较明显,其中add, search, delete都是处理一万条数据。sort是导出一个一万条排序好的array。按照zhou-hua的提醒,add和sort应该放到一起比较:(由于数据量比较大,所以刚打开的时候,浏览器会卡死一段时间)

原文链接:http://www.gbtags.com/gb/share/5592.htm

  1. 代码演示: http://www.gbtags.com/gb/rtreplayerpreview/1026.htm
时间: 2024-10-23 12:25:31

JS数据结构之BinarySearchTree的相关文章

JS数据结构第三篇---双向链表和循环链表

一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地址.然后头结点的上一个节点,和尾结点的下一个节点都指向null.同时LinkedList类中再增加一个last内部属性,一直指向链表中最后一个节点.结构模拟如图: 同样对外暴露的方法和单向链表一样,只是内部实现稍有变化 双向链表完整设计代码: /** * 自定义双向链表:对外公开的方法有 * append(e

js数据结构描述--集合

<script type="text/javascript"> //如何判断一个数组是否存在某一元素 //var arr = [1,2,3,5]; //var arr = {a:1,b:2,c:3}; function Set(data){ this.constructor = set; this.dataStore = Object.prototype.toString.apply(data) == '[object Array]' ? data : []; this.i

【4】学习JS 数据结构与算法笔记

第一章 JS 简介 1. 环境搭建的三种方式 1. 下载浏览器 2. 使用 Web 服务器 ( XAMPP ) 3. 使用 Node.js 搭建 Web 服务器 4. 代码地址>> 2. JS 语法

js数据结构与算法存储结构

数据结构(程序设计=数据结构+算法) 数据结构就是关系,没错,就是数据元素相互之间存在的一种或多种特定关系的集合. 传统上,我们把数据结构分为逻辑结构和物理结构. 逻辑结构:是指数据对象中数据元素之间的相互关系,也是我们今后最需要关注和讨论的问题. 物理结构:是指数据的逻辑结构在计算机中的存储形式. 常用的数据结构有: 数组,队列(queue),堆(heap),栈(stack),链表(linked list ),树(tree),图(graph)和散列表(hash) 栈(stack):运算只在表的

js:数据结构笔记3--栈

栈是一种特殊的列表,数据结构为LIFO: 定义: function Stack() { this.dataStore = []; this.top = 0; this.push = push; this.pop = pop; this.peek = peek; this.length = length; this.clear =clear; } function push(elem) { this.dataStore[this.top++] = elem; } function pop() {

【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)

最近小菜鸟西瓜莹看到了一道面试题: 给定二叉树,按层打印.例如1的子节点是2.3, 2的子节点是3.4, 5的子节点是6,7. 需要建立如图二叉树: 但是西瓜莹找到的相关代码都是用js构建最优二叉树,假如,依次向二叉树中添加4,2,6,1,3,5,7最优二叉树如图: 比根节点小的节点总是放在根节点的左节点上,比根节点大的节点总是放在根节点的右节点上. 假如想依次向二叉树添加1,2,3,4,5,6,7 二叉树又是如何呢? 后一个数据总是比前一个数据大,那么就会一直在根节点的右节点上. 构建最优二叉

【js数据结构】图的深度优先搜索与广度优先搜索

图类的构建 function Graph(v) {this.vertices = v;this.edges = 0;this.adj = []; for (var i = 0; i < this.vertices; ++i) { this.adj[i] = []; this.adj[i].push(""); } this.addEdge = addEdge; this.showGraph = showGraph; } function addEdge(v, w) { this.a

基本数据结构之BinarySearchTree

问题描述: BinarySearchTree 问题分析: 基本的实现 代码实现: package c04; /**  * @project: DataStructureAndAlgorithmAnalysis  * @filename: BinarySearchTree.java  * @version: 0.10  * @author: JM Han  * @date: 18:38 2015/10/19  * @comment: Test Purpose  * @result:  */ imp

js:数据结构笔记4--队列

队列是一种特殊的列表,数据结构为FIFO: 定义: function Queue() { this.dataStore = []; this.enqueue = enqueue; this.dequeue = dequeue; this.front = front; this.back = back; this.length = length; this.toString = toString; this.isEmpty = isEmpty; } function enqueue(elem) {