【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比

这篇具有很好参考价值的文章主要介绍了【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【数据结构与算法——TypeScript】

算法的复杂度分析

什么是算法复杂度(现实案例)?

❤️‍🔥 前面已经解释了什么是算法? 其实就是解决问题的一系列步骤操作、逻辑。
对于同一个问题,我们往往有很多种解决思路和方法,也就是可以采用不同的算法。

  • 举个例子(现实例子):在一个庞大的图书馆中,我们需要找一本书

    • 在图书已经按照某种方式摆好的情况下(数据结构是固定的)
  • 方式一:顺序查找

    • 一本一本找,直到找到想要的书;
  • 方式二:先分类找,分类中找这本书

    • 先找到分类,在分类中再顺序或某种方式查找
  • 方式三:找到检索电脑,查找书的位置,直到找到

    • 图书馆通常有自己的图书管理系统
    • 利用图书管理系统先找到书的位置,再直接过去找到

什么是算法复杂度(程序案例)?

🖥 在具体一个程序中的案例:让我们用两种不同算法查找数组中(数组有序)给定元素的复杂度

  • ✅ 方式一:顺序查找
    • 这种算法 从头到尾遍历整个数组,依次比较每个元素和给定元素的值
    • 如果 找到相等的元素,则返回下标;如果 遍历完整个数组都没找到,则返回 -1

【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比,数据结构与算法,typescript,算法,链表,前端

  /**
  - 顺序查找
  - @param array 查找的数组
  - @param 查找的元素
  - @returns 查找到的索引,未找到返回-1
  */
  function sequentSearch(array: number[], num: number) {
  for (let i = 0; i < array.length; i++) {
      const element = array[i];
      if (element === num) return i;
  }
  return -1;
  }
  const index = sequentSearch([1, 3, 5, 10, 100, 222, 333, 334, 555, 556], 222);
  console.log(index);

  • ✅ 方式二:二分查找

    • 这种算法假设数组是有序的,每次 选择数组中间的元素与给定元素进行比较
    • 如果 相等,则返回下标;如果 给定元素比中间元素小,则在数组的左半部分继续查找
    • 如果 给定元素比中间大,则在数组的右半部分继续查找
    • 这样 每次查找都会将查找范围减半,直到找到想等的元素或者查找范围为空

    【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比,数据结构与算法,typescript,算法,链表,前端

    function binarySearch(array: number[], num: number) {
    // 1. 定义左右索引
    let left = 0;
    let right = array.length - 1;
    
    // 2.开始查找
    while (left <= right) {
        let mid = Math.floor((left + right) / 2);
        const midNum = array[mid];
        if (midNum === num) {
        return mid;
        } else if (midNum < num) {
        left = mid + 1;
        } else {
        right = mid - 1;
        }
    }
    return -1;
    }
    const index = binarySearch([1, 3, 5, 10, 100, 222, 333, 334, 555, 556], 222);
    console.log(index);
    export {};
    

测试顺序查找和二分查找的代码

  • 使用🔧工具: npm install hy-algokit
import sequentSearch from './01_查找算法-顺序查找';
import binarySearch from './02_查找算法-二分查找';
import { testOrderSearchEfficiency } from 'hy-algokit';
testOrderSearchEfficiency(sequentSearch);
testOrderSearchEfficiency(binarySearch);

【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比,数据结构与算法,typescript,算法,链表,前端

  • ❤️‍🔥 顺序查找算法的时间复杂度是 O(n)

  • ❤️‍🔥 二分查找算法的时间复杂度是 O(log n)

大O表示法(Big O notation)

  • 大O表示法(Big O notation)英文翻译为大O符号,中文通常翻译为大O表示法(标记法)。
  • 大O符号在分析 算法效率的时候非常有用
    • 🌰 举例:解决 **一个规模为n的问题所花费的时间(或需要步骤的数目)可以表示为:
      • T(n)= 4n⌃2^ - 2n + 2**
      • n 增大 时, n^2^ 项开始 占据主导地位,其他各项可以被忽略
    • 🌰 : 当 n = 500
      • 4n2 项是 2n 项的 1000倍大,因此在大多数场合下, 省略后者对表达式的值的影响将是乐意忽略不计的

      • 进一步,如果我们与任一其他级的表达式比较, n2的系数也是无关紧要的的。

      • 这样,针对第一个例子, T(n)= 4 n2 - 2n + 2,大O符号就记下剩余的部分,写作:

        • T(n) ∈ O(n2)

          或者

        • T(n) = O(n2)

  • ❣️ 我们就说该算法 具有n2 阶(平方阶)的时间复杂度,表示为O(n2)
常见的对数阶
  • 常用的函数阶
符号 名称
O(1) 常数(阶、下同)
O(log n) 对数
O(n) 线性、次线性
O(n log n) 线性对数、或者对数线性、拟线性、超线性
O(n2) 平方
O(n2) , Interger(c > 1) 多项式,有时叫作‘代数’(阶)
O(cn) 指数,有时叫作“几何”(阶)

空间复杂度

  • 空间复杂度指的是,程序运行过程中所需要的额外存储空间。

    • 空间复杂度 也可以用大O表示法来表示;
    • **空间复杂度的计算方法与时间复杂度类似,**通常需要分析程序中 需要额外分配的内存空间,如数组、变量、对象、递归调用等
  • 🌰 :举例

    • 对于一个简单的 递归算法来说,每次调用会在内存中分配新的栈帧,这些栈帧占用了额外的空间
      • 因此,该算法的空间复杂度是 O(n),其中n是递归深度
    • 而对于 迭代算法来说,在 **每次迭代中不需要分配额外的空间,**因此 其空间复杂度为O(1)
  • 当空间复杂度很大时,可能会导致内存不足,程序崩溃。

  • 在平时进行算法优化时,我们通常会进行如下考虑:

    • 使用尽量少的空间(优化空间复杂度)
    • 使用尽量少的时间(优化时间复杂度)
    • 特定情况下:使用 空间换时间或使用 时间换空间

数组和链表的对比

  • 使用大O表示法来对比一下数组和链表的时间复杂度(增删改查)
Data Structure Access Search Insertion Deletion
Array O(1) O(N) O(N) O(N)
Linked List O(N) O(N) O(1) O(1)
  • 数组是一种连续的存储结构,通过下标可以直接访问数组中的任意元素

    • 时间复杂度: 对于数组,随机访问时间复杂度为O(1),插入和删除操作的时间复杂度为O(n)。
    • 空间复杂度:数组需要连续的存储空间,空间复杂度为 O(n)
  • 链表,是一种链式存储结构,通过指针链接起来的节点组成,访问链表中元素需要从头结点开始遍历

    • **时间复杂度:**对于链表,随机访问时间复杂度为O(n),插入和删除的时间复杂度为O(1)
    • **空间复杂度:**链表需要为每个节点分配存储空间,空间复杂度为O(n)
  • 💖 在实际开发中,选择使用数组还是链表需要根据具体应用场景来决定

    • 如果数据量不大,且需要频繁随机访问元素,使用数组可能会更好
    • 如果数据量很大,或者需要频繁插入和删除元素,使用链表可能会更好

【数据结构与算法——TypeScript】系列笔记:
1. 【数据结构与算法——TypeScript】数组、栈、队列、链表文章来源地址https://www.toymoban.com/news/detail-625951.html

到了这里,关于【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构与算法—时间复杂度和空间复杂度

    目录 1、什么是数据结构? 2、什么是算法? 3、算法的复杂度 4、时间复杂度 (1) 时间复杂度的概念:  (2) 大O的渐进表示法:  六个例题: (3) 时间复杂度对比:  三个例题:  OJ题分析时间复杂度 5、空间复杂度 (1)常见复杂度对比  (2)OJ题分析空间复杂度 小结 数据结构 (D

    2024年02月07日
    浏览(92)
  • 数据结构--算法的时间复杂度和空间复杂度

    算法效率是指 算法在计算机上运行时所消耗的时间和资源 。这是衡量算法执行速度和资源利用情况的重要指标。 例子: 这是一个斐波那契函数,用的是递归的计算方法,每次创建函数就会在栈区开辟一块空间,递归次数越多,开辟空间越多; 所以, 代码的简洁说明不了算

    2024年02月15日
    浏览(49)
  • 【数据结构与算法篇】时间复杂度与空间复杂度

       目录 一、数据结构和算法 1.什么是数据结构?  2.什么是算法? 3.数据结构和算法的重要性 二、算法的时间复杂度和空间复杂度 1.算法效率 2.算法的复杂度 3.复杂度在校招中的考察 4.时间复杂度 5.空间复杂度  6.常见复杂度对比 7.复杂度的OJ练习   👻内容专栏:《数据结

    2023年04月24日
    浏览(67)
  • 学习数据结构:算法的时间复杂度和空间复杂度

    衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。 算法的时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度。 算法的

    2024年04月11日
    浏览(45)
  • 数据结构 | 算法的时间复杂度和空间复杂度【详解】

    数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转

    2024年02月08日
    浏览(56)
  • 【数据结构与算法】1.时间复杂度和空间复杂度

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 算法效率分为两种:第一种是时间效率;第二种是空间效率。时间效率又称为时间

    2024年01月20日
    浏览(53)
  • 【数据结构初阶】算法的时间复杂度和空间复杂度

    1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢? 比如对于以下斐波那契数列: 斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?那该如何衡量其好与坏呢? 1.2 算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此

    2024年02月08日
    浏览(74)
  • 【数据结构与算法篇】之时间复杂度与空间复杂度

    ❤️博客主页: 小镇敲码人 🍏 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌞友友们暑假快乐,好久不见呀!!!💖💖💖 🍉 有人曾经问过我这样一个问题,“人终其一身,执着追求的东西究竟是什么?”我是这样回答的,”我们终其一生都在寻找着那个和我们灵魂极其契合

    2024年02月12日
    浏览(53)
  • 从头开始:数据结构和算法入门(时间复杂度、空间复杂度)

        目录 文章目录 前言 1.算法效率 1.1 如何衡量一个算法的好坏 1.2 算法的复杂度 2.时间复杂度  2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算 3.空间复杂度 4.常见复杂度对比 总结 前言         C语言的学习篇已经结束,今天开启新的篇章——数据结构

    2024年02月14日
    浏览(52)
  • 算法的复杂度【数据结构】

    算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源,因此衡量一个算法的好坏一般是从时间和空间两个维度来衡量的,即 时间复杂度 和 空间复杂度 时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。 方法

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包