实现动态数组
假设理解 Big O 表示法。 JavaScript 中有示例。资料参考 Gayle Laakmann McDowell 的《Cracking the Coding Interview》
介绍
在 JavaScript 或 Python 等某些语言中,数组会自动调整大小,这意味着数组会随着您追加项目而增长。在 Java 等其他语言中,数组是固定长度的,这意味着数组的大小是在初始化数组时定义的。这些自动增长的数组称为动态数组。
了解动态数组
在 Java 中,ArrayList 是一种类似数组的数据结构,它提供动态调整大小的同时仍然提供 O(1) 使用权。当数组已满时,数组的大小会加倍。每次加倍需要 O(n) 时间,但发生的情况很少,因此其摊销插入时间仍然是 O(1) .
在不同的编程语言中,该数据结构的名称及其调整大小因子(Java 中为 2)各不相同。调整大小因子决定数组大小将调整多大。
为什么是摊销插入时间 O(1) ?
调整大小时,假设调整大小因子为 2,我们可以观察到通过将前一个数组加倍(即 N 的一半),我们增加到大小为 N 的数组。此外,我们还需要复制 N/2 元素添加到这个新数组。
如果我们将从最终容量增加到第一次容量增加复制的元素数量相加: 2n+4n+8n+16n+...+2+1 其总和略小于 N。因此,插入 N 个元素大约需要 O(n) 总共工作。每次插入都是 O(1) 平均而言,即使某些插入需要 O(n) 最坏情况下的时间。
核心概念和大O复杂性
JavaScript 中的动态数组通常有几个核心方法,每个方法都有不同的时间复杂度:
get(i):此方法检索索引 i 处的元素。
- 复杂性: O(1)
set(i, n):该方法将索引 i 处的元素设置为 n。
- 复杂性: O(1)
pushback(n):该方法将元素 n 添加到数组末尾。
- 复杂性: O(1) 摊销,但是 O(n) 当调整大小时
popback():该方法删除数组的最后一个元素。
- 复杂性: O(1)
resize():该方法将数组的容量加倍,并将所有元素复制到新数组。
- 复杂性: O(n)
getSize():该方法返回数组中元素的数量。
- 复杂性: O(1)
- 注意:我们可以通过使用大小变量来跟踪数组中已填充槽的数量来实现这种复杂性。
getCapacity():该方法返回数组的当前容量。
- 复杂性: O(1)
JavaScript 中的实现
class DynamicArray { // size is # of filled slots while capacity is total slots in array constructor(capacity) { this.capacity = capacity; this.arr = new Array(this.capacity); this.size = 0; } // O(1) get(i) { if (i < 0 || i >= this.size) return undefined; return this.arr[i]; } // O(1) set(i, n) { if (i < 0 || i >= this.size) return undefined; this.arr[i] = n; } // O(1) amortized pushback(n) { if (this.size === this.capacity) { this.resize(); } this.arr[this.size] = n; this.size++; } // O(1) popback() { if (this.size === 0) return undefined; this.size--; let temp = this.arr[this.size]; this.arr[this.size] = undefined; return temp; } // O(n) resize() { this.capacity *= 2; let newArr = new Array(this.capacity); for (let i = 0; i < this.size; i++) { newArr[i] = this.arr[i]; } this.arr = newArr; } // O(1) getSize() { return this.size; } // O(1) getCapacity() { return this.capacity; } }
结论
动态数组是一种强大的数据结构,它结合了可调整存储大小的灵活性和恒定时间访问的效率。希望这有帮助!
以上是实现动态数组的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。
