比特数据结构课-前言、时间复杂度

2023-11-15

前言

1.什么是数据结构

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

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

3.作用?

    数据结构是计算机类的重要知识,是校园招聘的重要考察内容。目前校园招聘笔试一般采用Online Judge形式, 一般都是20-30道选择题+2道编程题,或者3-4道编程题。

   其中会有很多比较难的编程题,对算法的考察也是无处不在,对于算法,需要从基础打好。

  算法对工作的作用:学好算法对一个程序员来说是必须的吗?如果是,至少应该学到哪种程度? - 知乎 (zhihu.com)

 4. 如何学好数据结构

1.很简单,学到下图那样就行了。

2.多思考和画图!!!!!!!

5.学习资料建议
1.剑指offerOJ牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)

2.力扣网。

1.程序的评价

一个程序的好坏是有多方面的评价体系的,比如可读性、可维护性、时间复杂度、空间复杂度等

如下斐波那契数列的函数

long long Fib(int N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

很简洁,但是好吗?

对于一个算法,算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。因此现在我们更加看重时间复杂度。

2.时间复杂度


通常算法中的基本操作的执行次数表示算法的时间复杂度。但实际使用时算法的时间复杂度是一个函数,用大O的渐进表示法表示

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。
有些算法会出现最好情况、最坏情况、期望情况等三类,通常用其时间复杂度用最坏情况表示。
example1

void Func2(int N)
{
int count = 0;
for (int k = 0; k < 2 * N ; ++ k)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
printf("%d\n", count);
}
执行了2n+10次,因此是O(N);

example2:

void Func4(int N)
{
int count = 0;
for (int k = 0; k < 100; ++ k)
{
++count;
}
printf("%d\n", count);
}

执行了100次,是一个常数,时间复杂度是O(1);

example3:

const char * strchr ( const char * str, int character );

//这个函数是从字符串第一个字符开始查找,直到找到character,然后返回其字符串中它的地址。
 

其他

冒泡排序

快速排序

                                 

3.空间复杂度

有了时间复杂度的经验,空间复杂度应该也不难掌握,先来两道练手题

// 计算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 < end; ++i)
  {
     if (a[i-1] > a[i])
    {
      Swap(&a[i-1], &a[i]);
      exchange = 1;
    }
 }
   if (exchange == 0)
   break;
 }
}

 这个冒泡排序只额外开了exchange一个变量,因此是O(N)

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前n项
long long* Fibonacci(size_t n)
{
   if(n==0)
   return NULL;
   long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));
   fibArray[0] = 0;
   fibArray[1] = 1;
   for (int i = 2; i <= n ; ++i)
   {
   fibArray[i] = fibArray[i - 1] + fibArray [i - 2];
   }
   return fibArray;
}

这个开了一个有n个元素的数组,空间使用了n个,因此是O(N)

// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{
if(N == 0)
return 1;
return Fac(N-1)*N;
}

这个是函数递归,函数的连续调用开了连续的n个空间,因此是O(N)

再来看看这个:

// 计算斐波那契递归Fib的空间复杂度?
long long Fib(size_t N)
{
if(N < 3)
return 1;
return Fib(N-1) + Fib(N-2);
}

这个就需要对于空间比较深刻的理解了

函数递归的调用会启用栈空间

我们知道,Fib(n)会调用Fib(n-1)、Fib(n-2)并且调用顺序是先n-1后n-2,由于n-1会继续递归,因此这个n-2的就被暂时搁置了,那么接下来每一个都会先调自己下面的第一个,直到调到3。(此时空间已经调用了O(N))那么到这里之后,调用3之后空间被销毁。但是这里空间的销毁不是把内存条给掰断之类的,而是把这片空间里存着的Fib(3)给它踢出去,然后塞进它的上一个的右下函数(类似二叉树的右孩)但是空间总数不变,这个右下掉完也被踢出去,以此类推,所以自此以后不会再开启新的空间,因此答案是O(N);

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

比特数据结构课-前言、时间复杂度 的相关文章

  • 算法与数据结构(二十五)TopK问题:基于快排的Python模板

    首先 先写partition模板 def partition nums left right pivot nums left 初始化一个待比较数据 i j left right while i lt j while i
  • 分治—快速选择算法

    文章目录 215 数组中的第K个最大元素 1 题目 2 算法原理 3 代码实现 LCR 159 库存管理 III
  • 算法题-简单系列-03-判断链表中是否有环

    文章目录 1 题目 1 1 思路1 双指针 1 2 思路2 哈希表 1 题目 判断给定的链表中是否有环 如果有环则返回true 否则返回false 1 1 思路1 双指针 我们使用两个指针 fast 与 slow 它们起始都位于链表的头部
  • 算法题-简单系列-01-链表反转

    文章目录 1 题目 1 1 使用栈解决 1 2 反转链表 1 题目 给定一个单链表的头结点pHead 该头节点是有值的 比如在下图 它的val是1 长度为n 反转该链表后 返回新链表的表头 如当输入链表 1 2 3 时 经反转后 原链表变为
  • 【C语言】【数据结构】【手搓二叉树】用数组实现一个二叉树

    这里用数组 顺序表 实现一个二叉树 Heap h include
  • 基于Java的数据结构精品课程教学网站

    收藏关注不迷路 源码文章末 文章目录 前言 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 前言 本基于Java的数据结构精品课程教学网站是根据当前教学大环境相关的内容实际情况开发的 在系统语言选择上我们使
  • 算法设计与实现--贪心篇

    贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法 以期望能够通过一系列局部最优的选择达到全局最优 贪心算法的关键是定义好局部最优的选择 并且不回退 即一旦做出了选择 就不能撤销 一般来说 贪心算法适用于满足以下两个条件的
  • 八大排序(插入排序 | 选择排序 | 冒泡排序)

    在我们内存中我们一般会有一些没有顺序的数据 我们成为内排序 而今天分享八大排序的是时间复杂度为O N 2 的插入排序 选择排序和教学意义比较强的冒泡排序 插入排序 这是插入排序的动图 通过动图我们也是可以看到我们的插入排序的思想 从当前的位
  • 【数据结构入门精讲 | 第二篇】一文讲清算法复杂度

    上篇文章中我们引入了算法 数据结构 数据类型等概念 而要想衡量一个算法与数据结构是否为优质的 就需要一个衡量标准 这个衡量标准也是在我们实现一个好的算法时要遵循的原则 目录 基本概念 渐进性态 渐进性态数学表征 算法复杂度的运算 顺序搜索算
  • DS八大排序之冒泡排序和快速排序

    前言 前两期我们已经对 插入排序 直接插入排序和希尔排序 和 选择排序 直接选择排序和堆排序 进行了详细的介绍 这一期我们再来详细介绍一组排序 交换排序 即耳熟能详的冒泡排序和赫赫有名的快速排序 本期内容介绍 冒泡排序 快速排序 Hoare
  • 剑指 Offer(第2版)面试题 35:复杂链表的复制

    剑指 Offer 第2版 面试题 35 复杂链表的复制 剑指 Offer 第2版 面试题 35 复杂链表的复制 解法1 模拟 剑指 Offer 第2版 面试题 35 复杂链表的复制 题目来源 48 复杂链表的复刻 解法1 模拟 算法 复制原
  • 深度学习目标检测全连接层什么意思

    在深度学习目标检测中 通常我们使用卷积神经网络 Convolutional Neural Network CNN 进行特征提取 CNN 的主要结构包括卷积层和池化层 用于从输入图像中提取特征 然而 为了最终输出目标的类别和位置信息 通常在网
  • 【数据结构和算法】 K 和数对的最大数目

    其他系列文章导航 Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一 题目描述 二 题解 2 1 方法一 双指针排序 三 代码 3 1 方法一 双指针排序 3
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 回溯算法第零篇【递归、搜索与回溯】【回溯算法入门必看】

    本篇文章的目的 1 给小伙伴们对回溯算法中的名词进行解释 2 消除递归的恐惧 回溯是递归的一个分支 给小伙伴们一个建议 整篇文章都要看完 一字不漏 全是干货 注意 分析回溯的思想之前 我们得知道一个关系 递归包含搜索 搜索包含回溯 所以我们
  • 数组对象排序 (arr.sort())

    前端面试题库 面试必备 推荐 地址 前端面试题库 对象排序 arr sort 描述 方法sort 将在原数组上对 数组元素 进行排序 即排序时不创建新的数组副本 如果想按照别的顺序进行排序 就必须提供比较函数 该函数要比较两个值 然后返回一
  • 【每日一题】2397. 被列覆盖的最多行数-2024.1.4

    题目 2397 被列覆盖的最多行数 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆
  • 【每日一题】2397. 被列覆盖的最多行数-2024.1.4

    题目 2397 被列覆盖的最多行数 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆
  • 单向不带头链表的使用

    单向不带头链表的使用 链表的创建 typedef struct LNode SLDataType data struct LNode next LNode LinkList 按位查找 LNode GetElem LinkList L int
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • OrCAD Capture学习笔记

    1 OrCAD Capture文件类型 OrCAD Capture是Cadence公司用来进行原理图绘制的一个EDA软件 能用这个软件打开的常用的几个文件后缀名为 dsn opj olb lib net 这些文件后缀具体表示的意思如下 这些
  • php 万能密码,网络安全系列之十 万能密码登录网站后台

    在登录网站后台时 有一个比较古老的 万能密码 漏洞 即利用一个我们精心构造的用户名 即使不用输入密码 也可以登录后台 其原理仍属于SQL注入的范畴 假设数据库中存放用户信息的表是admin 其中存放用户名的字段是username 存放密码的
  • git报错ssh: connect to host github.com port 22: Connection timed out

    碰到了git拉代码时报出的一个错误 通过查阅资料尝试了几种方法之后解决了 在这做个记录 首先需要检查一下SSH是否能够连接成功 输入以下命令 ssh T git github com 若还是报这个错ssh connect to host g
  • Solidity中的pure和view修饰符的区别是什么?什么时候添加pure和view修饰符?

    Solidity是一种用于编写智能合约的编程语言 它被广泛应用于以太坊区块链上的智能合约开发 在Solidity中 有两种函数修饰符 即 pure 和 view 它们被用来指示函数的行为 这篇文章将深入探讨 pure 和 view 的含义
  • PyTorch中使用预训练的模型初始化网络的一部分参数(增减网络层,修改某层参数等) 固定参数

    在预训练网络的基础上 修改部分层得到自己的网络 通常我们需要解决的问题包括 1 从预训练的模型加载参数 2 对新网络两部分设置不同的学习率 主要训练自己添加的层 一 加载参数的方法 加载参数可以参考apaszke推荐的做法 即删除与当前mo
  • 查看 elasticsearch版本号

    查看 elasticsearch版本号 输入命令 curl XGET localhost 9200 得到 name OmUcqLr cluster name elasticsearch cluster uuid AQHIcDW Q9K80U
  • 使用U盘重装MacBook Air时用到的工具和镜像

    主要是工具和镜像 非重装教程 前言 工具 镜像 前言 我之前没接触过苹果笔记本 设备是邻居的白苹果 近期因为双系统中的windows出故障了 所以索性帮他重装 用U盘重装MacBook Air教程网上有一堆 大家应该都能搜索到 主要是工具和
  • aanet

    AANet feature extractor AANetFeature conv1 Sequential 0 Conv2d 3 32 kernel size 7 7 stride 3 3 padding 3 3 bias False 1
  • VSCODE:终端界面简洁化和cmd.exe界面显示

    最近在配置vscode 想用来编写一些c和c 算法文件 编写helloword cpp文件 运行发现程序输出结果显示在终端界面 且含有一长串复杂的无用字符 因此考虑简化这个终端界面 在网上查询了众多教程 大部分都是修改launch json
  • 如何使用 Serverless 做架构和项目管理—— 三年全栈经验总结

    本文是从项目工程角度来讲解的 技术角度请参看另一个文章 真实项目代码教你四步扔了传统服务器 让你优雅使用Serverless做全栈开发 https zhuanlan zhihu com p 本文汇总了我的多个Serverless的全栈项目实
  • [c++]力扣303+304 区域和检索 二维区域和检索

    最近开始重新刷题 从链表开始 第一部分是前缀和 分为一维数组前缀和和高维数组前缀和 abandon 前缀和数组是牺牲空间换时间的方法 为了解决频繁访问数组某区间的问题 先构造出从开始到当前位置的元素的和 储存在前缀和数组中 查询的时候直接查
  • 小波神经网络(WNN)的实现(Python,附源码及数据集)

    文章目录 一 理论基础 1 小波神经网络结构 2 前向传播过程 3 反向传播过程 4 建模步骤 二 小波神经网络的实现 1 训练过程 WNN py 2 测试过程 test py 3 测试结果 4 参考源码及实验数据集 一 理论基础 小波神经
  • Java设计模式-单例模式

    模式定义 确保一个类最多只有一个实例 并提供一个全局访问点 单例模式分为饿汉式和懒汉式 懒汉式单例模式 在类加载时不初始化 饿汉式单例模式 在类加载时就完成了初始化 所以类加载比较慢 但获取对象的速度快 饿汉式 线程安全 饿汉式单例模式 线
  • 2022必备react面试题 附答案

    2022必备react面试题 1 React的严格模式如何使用 有什么用处 StrictMode 是一个用来突出显示应用程序中潜在问题的工具 与 Fragment 一样 StrictMode 不会渲染任何可见的 UI 它为其后代元素触发额外
  • 初学者对java数组中栈和堆的认识

    java数组中栈和堆的认识 1 示例 2 结论 3 图例子 1 示例 public static void main String args String Array null Array new String 3 Array 0 安徽合肥
  • NRF52832学习笔记(2)—— 添加DFU功能(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在 uart 的例程中添加 DFU 功能 使用 s132 的协议栈 因为官方的 BootLoader 工程用的是s132的协议栈 一 准备工作 在开始实验之前必须先准备以下软件 gcc a
  • linux总结-常用命令(2)

    ls命令 ls命令为list的缩写 通过ls命令可以查看Linux文件夹中包含的文件及其文件权限 包括目录 文件夹 文件权限 目录信息等等 ls 选项 目录 文件 选项 a 列出目录所有文件 包含以 开始的隐藏文件 A 列出除 及 的其它文
  • MDF,LDF格式文件还原数据库

    点你的数据服务名 gt 右键 gt 附加数据库 gt 选择你要还原的数据库文件
  • mxnet——模型加载与保存

    一 加载模型与pretrain模型network相同 loading predict module data shape G 96 Batch namedtuple Batch data sym arg params aux params
  • 比特数据结构课-前言、时间复杂度

    前言 1 什么是数据结构 数据结构 Data Structure 是计算机存储 组织数据的方式 指相互之间存在一种或多种特定关系的数据元素的集合 2 什么是算法 算法 Algorithm 就是定义良好的计算过程 他取一个或一组的值为输入 并