小工具知识网

当前位置: 首页 > 行业知识 > 探索数据结构:解锁计算世界的密码

行业知识

探索数据结构:解锁计算世界的密码

2026-11-02 04:18:31 来源:互联网转载

✨✨ ���迎大家来到贝蒂大讲堂✨✨

养成好习惯,先赞后看哦~

所属专栏:数据结构与算法

贝蒂的主页:Betty‘s blog

前言

随着应用程序变得越来越复杂和数据越来越丰富,几百万、几十亿甚至几百亿的数据就会出现,而对这么大对数据进行搜索、插入或者排序等的操作就越来越慢,人们为了解决这些问题,提高对数据的管理效率,提出了一门学科即:数据结构与算法

1. 什么是数据结构

**数据结构(Data Structure)**是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

下标是常见的数据结构:

名称定义
数组(Array)数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。
链表(Linked List)链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。
栈(Stack)栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作
队列(Queue)队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。
树(Tree)树是典型的非线性结构,它是包括,2 个结点的有穷集合 K
堆(Heap)堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。
图(Graph)图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对

2. 什么是算法

**算法(Algorithm)*就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

算法一般分为:排序,递归与分治,回溯,DP,贪心,搜索算法

  • 算法往往数学密切相关,就如数学题一样,每道数学题都有不同的解法,算法也是同理。

    3. 复杂度分析

    3.1 算法评估

    我们在进行算法分析时,常常需要完成两个目标**。一个是找出问题的解决方法,另一个就是找到问题的最优解**。而为了找出最优解,我们就需要从两个维度分析:

    • 时间效率:算法运行的快慢
    • 空间效率:算法所占空间的大小

      3.2 评估方法

      评估时间的方法主要分为两种,一种是实验分析法,一种是理论分析法。

      (1) 实验分析法

      实验分析法简单来说就是将不同种算法输入同一台电脑,统计时间的快慢。但是这种方法有两大缺陷:

      1. 无法排查实验自身条件与环境的条件的影响:比如同一种算法在不同配置的电脑上的运算速度可能完全不同,甚至结果完全相反。我们很难排查所有情况。
      2. 成本太高:同一种算法可能在数据少时表现不明显,在数据多时速率较快
      (2) 理论分析法

      由于实验分析法的局限性,就有人提出了一种理论测评的方法,就是渐近复杂度分析(asymptotic complexity analysis),简称复杂度分析。

      这种方法体现算法运行所需的时间(空间)资源与输入数据大小之间的关系,能有效的反应算法的优劣。

      4. 时间复杂度与空间复杂度

      4.1 时间复杂度

      一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

      为了准确的表述一段代表所需时间,我们先假设赋值(=)与加号(+)所需时间为1ns,乘号(×)所需时间为2ns,打印所需为3ns。

      让我们计算如下代码所需总时间:

      int main(){int i = 1;//1nsint n = 0;//1nsscanf("%d", &n);for (i = 0; i  

      计算时间如下:

      T ( n ) = 1 + 1 + 3 × n = 3 n + 2 T(n)=1+1+3×n=3n+2 T(n)=1+1+3×n=3n+2

      但是实际上统计每一项所需时间是不现实的,并且由于是理论分析,当n—>∞时,其余项皆可忽略,T(n)的数量级由最高阶决定。所以我们计算时间复杂度时,可以简化为两个步骤:

      1. 忽略除最高阶以外的所有项。
      2. 忽略所有系数。

      而上述代码时间可以记为O(n),这种方法被称为大O的渐进表示法。如果计算机结果全是常数,则记为O(1)。

      • 并且计算复杂度时,有时候会出现不同情况的结果,这是应该以最坏的结果考虑。

        4.2 空间复杂度

        空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。空间复杂度的表示也遵循大O的渐进表示法

        让我们计算一下冒泡排序的空间复杂度

        // 计算BubbleSort的空间复杂度?void BubbleSort(int* a, int n){assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i  a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}}
        • 通过观察我们可以看出,冒泡排序并没有开辟多余的空间,所以空间复杂度为O(1).

          5. 复杂度分类

          算法的复杂度有几个量级,表示如下:

          O ( 1 )

上一篇:黑客网络源代码修改揭秘,犯罪技术手段大起底!

下一篇:爱普生L383打印机全面评测与实用指南