它是一种表示法,决定算法运行的速度有多快或多慢。这个速度不是由秒决定的,而是由算法的运行时间随着元素的增加而增加多少决定的。
大O是时间和大小的关系。在整篇文章中,您将看到包含这些度量的图表,并且您将在实践中更好地理解它们。我们有两种类型的复杂性(空间和时间)。
时间复杂度: 确定执行与输入大小成正比的算法所需的时间。
空间复杂度: 确定将分配多少内存来查找我们需要的项目。
为什么要研究这个?
- 通过它,您可以确定算法的可扩展性
- 大O总是处理最坏的情况,例子如下:
示例:
- 您有一个列表,并且想要搜索某个项目,但该项目位于列表的末尾。最坏的情况是你必须执行尽可能多的操作,直到找到你想要的数据。
执行次数
康斯坦特节奏 O(1):
- 无论数组大小如何,总是花费相同的时间
示例:
- 增加或减少
function increment(value: number){ return ++value } function decrement(value: number){ return --value }
- 拿走一个特定的物品
const fruits = ["apple", "orange", "grape", "banana"] function getItem(items: string[], index: number) { return items[index] } const item = getItem(fruits, 2) console.log(`fruit: ${item}`) // "grape"
- 获取数组的第一个元素
const animes = ["one piece", "dragon ball", "naruto", "demon slayer"] function getFirstElement(items: string[]){ return items[0] }
- 获取数组中的最后一项
const animes = ["one piece", "dragon ball", "naruto", "demon slayer"] function getLastElement(items: string[]){ return items[item.length - 1] } let lastElement = getLastElement(animes) console.log(`Last Element: ${lastElement}`)
线性时间 O(n):
- 执行时间与数组大小成正比
- 排序和二分搜索算法
- 仅使用一个循环进行迭代
示例:
- 为了找到 10 个项目的数组中最大的数字,我将滚动所有项目,直到找到它。
- 在最坏的情况下,最大的数字将是最后一个。
const numbers = [0, 4, 8, 2, 37, 11, 7, 48] function getMaxValue(items: number[]) { let max = numbers[0]; for (let i=0; i max) { max = items[i] } } return max; } let maxValue = getMaxValue(numbers) console.log(`Max Value: ${maxValue}`)
对数时间 O(log n)
- 输入大小增加n,执行时间增加log n,时间以对数比例增长。
- 记住 n 是数组中元素的数量。
- 输入的增长速度快于执行时间。
示例:
- 我们将在数组中执行二分搜索来查找特定项目。
const numbers = [0, 9, 24, 78, 54, 88, 92, 100, 21, 90] function binarySearch(nums: number[], target: number) { let left = 0; let right = nums.length - 1; while (left
- 为了更好地理解对数增长,让我们看如下:我们在示例中使用的数组有 10 个输入,因此:
log2(10) = 3.4
log2(20) = 4.3
log2(40) = 5.3
- 下面的图表将更容易理解:
线性/拟线性时间 O(n log n)
- 算法的时间复杂度是指执行n次对数运算。
- O(log(n)) 和 O(n) 的混合。
- 归并排序就是一个结构示例。
- 适度增长。
- 一部分以 n 为单位,另一部分以 log(n) 为单位,下面的例子是一个幸运的合并:
function increment(value: number){ return ++value } function decrement(value: number){ return --value }
二次时间 O(n²)
- 随着输入数量的增加,执行时间呈二次方增加。
- 阅读矩阵。
- 基本上当需要 2 个嵌套循环时
- 冒泡排序
示例:
const fruits = ["apple", "orange", "grape", "banana"] function getItem(items: string[], index: number) { return items[index] } const item = getItem(fruits, 2) console.log(`fruit: ${item}`) // "grape"
时间指数 O(2ˆn)
- 每插入一个元素到输入中,执行时间就会加倍。
- 此代码的一个示例是斐波那契
const animes = ["one piece", "dragon ball", "naruto", "demon slayer"] function getFirstElement(items: string[]){ return items[0] }
阶乘时间 O(n!)
- 执行时间根据输入的大小按阶乘增加。
示例:
- 生成数组内的所有排列
const animes = ["one piece", "dragon ball", "naruto", "demon slayer"] function getLastElement(items: string[]){ return items[item.length - 1] } let lastElement = getLastElement(animes) console.log(`Last Element: ${lastElement}`)
以上是大 O 符号的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript字符串替换方法详解及常见问题解答 本文将探讨两种在JavaScript中替换字符串字符的方法:在JavaScript代码内部替换和在网页HTML内部替换。 在JavaScript代码内部替换字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 该方法仅替换第一个匹配项。要替换所有匹配项,需使用正则表达式并添加全局标志g: str = str.replace(/fi

利用轻松的网页布局:8个基本插件 jQuery大大简化了网页布局。 本文重点介绍了简化该过程的八个功能强大的JQuery插件,对于手动网站创建特别有用

因此,在这里,您准备好了解所有称为Ajax的东西。但是,到底是什么? AJAX一词是指用于创建动态,交互式Web内容的一系列宽松的技术。 Ajax一词,最初由Jesse J创造

10款趣味横生的jQuery游戏插件,让您的网站更具吸引力,提升用户粘性!虽然Flash仍然是开发休闲网页游戏的最佳软件,但jQuery也能创造出令人惊喜的效果,虽然无法与纯动作Flash游戏媲美,但在某些情况下,您也能在浏览器中获得意想不到的乐趣。 jQuery井字棋游戏 游戏编程的“Hello world”,现在有了jQuery版本。 源码 jQuery疯狂填词游戏 这是一个填空游戏,由于不知道单词的上下文,可能会产生一些古怪的结果。 源码 jQuery扫雷游戏

本教程演示了如何使用jQuery创建迷人的视差背景效果。 我们将构建一个带有分层图像的标题横幅,从而创造出令人惊叹的视觉深度。 更新的插件可与JQuery 1.6.4及更高版本一起使用。 下载

本教程演示了创建通过Ajax加载的动态页面框,从而可以即时刷新,而无需全页重新加载。 它利用jQuery和JavaScript。将其视为自定义的Facebook式内容框加载程序。 关键概念: Ajax和JQuery

此JavaScript库利用窗口。名称属性可以管理会话数据,而无需依赖cookie。 它为浏览器中存储和检索会话变量提供了强大的解决方案。 库提供了三种核心方法:会话


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Atom编辑器mac版下载
最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。