Javascript 中的链表与数组

2024-04-04

所以我在 JS 中玩弄链表并提出以下问题:

假设我们有一个数组和一个链表,都有 5000 个元素。我们想在索引 10 处插入新元素。数组方式非常简单。我们在给定索引处插入新元素,并将其余元素向前移动一个索引。所以我尝试用链表来做到这一点,并以以下结果结束:

获取链表的实现尼古拉斯·扎卡斯 https://github.com/nzakas/computer-science-in-javascript/blob/master/data-structures/linked-list/linked-list.js并添加附加方法 addOnPosition(data,index)。最后是代码:

function LinkedList() {
this._head = null;
this._length = 0;
}

LinkedList.prototype = {

constructor: LinkedList,

add: function(data) {

    var node = {
            data: data,
            next: null
        },
        current;

    if (this._head === null) {
        this._head = node;
    }
    else {
        current = this._head;
        while (current.next) {
            current = current.next;
        }
        current.next = node;
    }
    this._length++;
},

remove: function(index) {

    if (index > -1 && index < this._length) {

        var current = this._head,
            previous,
            i = 0;


        if (index === 0) {
            this._head = current.next;
        }
        else {
            while (i++ < index) {
                previous = current;
                current = current.next;
            }
            previous.next = current.next;
        }

        this._length--;
        return current.data;
    }
    else {
        return null;
    }
},

item: function(index) {

    var current = this._head,
        i = 0;

    if (index > - 1 && index < this._length) {

        while (i++ < index) {
            current = current.next;
        }
        return current.data;

    }
    else {
        return null;
    }
},

addOnPosition: function(data,index) {

    if (index > -1 && index <= this._length) {
        var node = {
                data: data,
                next: null
            },
            current = this._head,
            i = 0,
            temp,
            previous;

        if (this._head === null) {
            this._head = node;
        }
        else {
            if (index === 0) {
                this._head = node;
                node.next = current;
            }
            else {
                while (i++ < index) {
                    previous = current;
                    current = current.next;
                }
                previous.next = node;
                node.next = current;
            }
        }
        this._length++;
    }
    else {
        return null;
    }
},

toArray: function() {
    var result = [],
        current = this._head;

    while (current) {
        result.push(current.data);
        current = current.next;
    }
    return result;
},
toString: function() {
    return this.toArray().toString();
}
}

最后,我的问题是:这种方法是否比使用数组执行所有这些操作更快?如果是,两者的复杂性是多少? 也许更重要的是,我是否错过了 adOnPosition 方法实现的某些内容?


See http://en.wikipedia.org/wiki/Dynamic_array#性能 http://en.wikipedia.org/wiki/Dynamic_array#PerformanceLinkedList 和 ArrayList 数据结构的复杂性。对于有趣的人,还可以查看何时使用 LinkedList 而不是 ArrayList? https://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist


在单链表中的节点后面插入是一个常数时间操作。如果双向链表中有一个节点,在它之前插入也是一个常数时间操作。

但是,您的 addOnPosition 函数会沿着链表“index”运行;也就是说,您从一个节点跳转到下一个节点很多次。因此,你的算法的复杂度基本上是 O(index) - 我们将其写为 O(n)。

解释一下我的观点:如果你想在第 0 个元素处插入一个节点,你的操作基本上会以恒定的时间运行;你得到this._front节点,你就完成了。要插入到线性单链表的末尾,您必须向下迭代到列表的末尾,执行从一个节点到下一个节点的更多“跳转”。您可以使用循环链表 http://en.wikipedia.org/wiki/Linked_list#Circular_list来优化这个案例。

至于使用数组列表执行类似的插入,插入复杂度基本上是 O(长度 - 索引),因为长度索引元素必须在数组中向下移动,我们将其写为 O(n)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 中的链表与数组 的相关文章

随机推荐

  • Android 中的最大 BackStack 大小

    我是android开发的新手 我需要知道最大内存大小 of 后台堆栈 in android我想知道有多少活动 of 安卓应用 can be 存储在 BackStack 中 Thanks 后台堆栈的最大内存大小与设备上的可用内存量相同 您可以
  • 有 F#(或 C#)中的 R 树实现吗? [复制]

    这个问题在这里已经有答案了 可能的重复 是否有任何记录在案的 NET 的免费 R Tree 实现 https stackoverflow com questions 2041834 is there any documented free
  • 多行组并使用正则表达式进行搜索

    好的 正则表达式向导 我希望能够搜索我的日志文件并找到其中包含 错误 一词的任何会话 然后返回整个会话日志条目 我知道我可以使用字符串 数组来做到这一点 但我想学习如何使用正则表达式来做到这一点 但这就是问题 如果我决定使用正则表达式来做到
  • DataTables 固定标题与宽表中的列未对齐

    Problem 当使用sScrollX sScrollXInner and or sScrollY为了实现内部内容滚动的固定标题表格 在 Chrome 和 IE 中 表格的标题与正文的其余部分不对齐 另一方面 Firefox 可以完美地显示
  • 为什么堆比二叉树更好地表示优先级队列?

    在 最大 堆中 很容易找到最大的项目O 1 时间 但要真正删除它 你需要复杂性O log n 因此 如果从堆中插入和删除都是O log n 用堆来表示优先级队列比二叉树有什么优点 堆使用较少的内存 它们可以作为数组实现 因此没有存储指针的开
  • OpenFileDialog 切断预先填充的文件名[重复]

    这个问题在这里已经有答案了 我使用以下命令来显示 打开文件 对话框 OpenFileDialog fdlg new OpenFileDialog fdlg FileName Properties Settings Default Last
  • 如何使用 webpack 填充 Promise?

    我正在使用 webpack 来捆绑我的 JavaScript 我依赖于类似的模块popsicle https www npmjs com package popsicle哪个使用任何承诺 https www npmjs com packag
  • [ngModel] 和 (ngModelChange) 如何协同工作?

    我是 Angular 的新手 正在学习 Angular 6 我了解 ngModel 但当我尝试 ngModelChange 时 出现了一些问题 我有一个 html 元素 超文本标记语言
  • 在 heroku 上以沙箱模式运行 Rails 控制台

    在文档中找不到它 在SO上也找不到它 但是有没有办法在heroku Celadon Cedar 上以沙盒模式运行Rails 3 2 x 控制台 相当于 rails console sandbox 对于更 Heroku 方式 的替代方案 he
  • 使用 JQuery 和 Django 上传图像

    在继续阅读之前 请相信我 我已经阅读了有关此主题的所有其他帖子 但没有一个对您有帮助 我正在尝试向我的网站添加图像上传功能 我想上传图片 通过 ajax 帖子 我无法让这个工作 这是我所拥有的 HTML 我有一个特殊的设置 以便显示图像而不
  • 屏幕截图安全桌面

    我正在处理屏幕共享项目 我正在使用以下功能捕获桌面屏幕 它工作正常 但每当安全桌面提示提升 https learn microsoft com en us windows security threat protection securit
  • 我如何在asp.net core 2.2中实现Cookie基础身份验证和jwt?

    我想同时使用基于 cookie 的身份验证和jwt在我的程序中 使用身份验证用户来访问mvc具有登录名和 JWT 的控制器来访问 WebApi 资源 我尝试使用其中两个首先 我的客户端可以使用用户名和密码登录并通过 cookie 进行身份验
  • 运行 ng new 命令时茉莉花版本错误

    我在运行 ng new 命令时遇到错误 在 ng new Project Name Here 期间触发以下错误 无法解决依赖关系 错误同级 jasmine core gt 3 7 1 来自 电子邮件受保护 cdn cgi l email p
  • 使用 TOpenDialog 选择目录

    我真的很想知道使用 TOpenDialog 选择目录的各种方法 无论是下载新组件还是使用 Delphi 提供的内容 但最好使用 Delphi 提供的内容 在此之前 我一直在使用 SelectDirectory 命令 但我认为对于我的程序的用
  • 如何在Python中使库异步

    在我的工作中 他们 利用 龙卷风 但他们没有异步库 是什么让库变得异步 以便它更适合龙卷风之类的东西 有没有什么好的例子或者我猜你在做什么 enter or exit 这可以表明您没有阻止 我发现很难将一些材料拼凑在一起 如果您的库不是异步
  • 如果定义了构造函数,pytest 跳过测试类

    我有以下通过 py test 运行的单元测试代码 构造函数的存在会使整个类在运行时跳过 py test v s 已收集 0 件 已跳过 1 件 谁能向我解释 py test 的这种行为吗 我有兴趣了解 py test 行为 我知道不需要构造
  • UITextView文本背景颜色

    我正在尝试获得一个透明的 UITextView 并且我知道如何设置它 我还想要的是在已显示的文本下方有一个彩色背景 同样 文本视图背景会将整个视图矩形设置为给定的颜色 我想要的是文本下方的颜色 有什么简单的方法可以实现这样的目标吗 据我所知
  • 有没有办法在提供左值和右值重载的同时删除重复代码?

    在学习 C 时 我决定编写一个简单的模板化二叉搜索树 bst 并遇到以下问题 我希望能够构造通过向其传递一个左值来实现 bst 例如const T val和一个像这样的右值T val 同样我希望能够insert左值和右值 所以我最终得到了很
  • getChildFragmentManager() 和 viewpager

    我有同样的问题导航回 FragmentPagerAdapter gt 片段为空 https stackoverflow com questions 17672779 navigating back to fragmentpageradapt
  • Javascript 中的链表与数组

    所以我在 JS 中玩弄链表并提出以下问题 假设我们有一个数组和一个链表 都有 5000 个元素 我们想在索引 10 处插入新元素 数组方式非常简单 我们在给定索引处插入新元素 并将其余元素向前移动一个索引 所以我尝试用链表来做到这一点 并以