基本概念与复杂度

提示:记录学习路径,希望更好地去掌握所学的知识,个人总结与学习交流使用,方便的话可以一起交流


前言

数据结构是一个相对来说比较抽象的概念,是指计算机存储、组织数据的方式,是算法的基础,掌握好数据结构可以更高效的选择算法,也方便代码的维护(个人理解)

一、常见的数据结构

常见的数据结构包括:

  • 数组(Array):一种基础的线性数据结构,可以在内存中连续存储多个元素,这些元素通常是相同类型的数据。
  • 链表(Linked List):由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。
  • 栈(Stack):一种遵循后进先出(LIFO)原则的线性数据结构。
  • 队列(Queue):一种遵循先进先出(FIFO)原则的线性数据结构。
  • 树(Tree):一种非线性数据结构,由节点组成,每个节点都有零个或多个子节点。
  • 图(Graph):由顶点的集合及连接这些顶点的边的集合组成,用于表示物件之间多对多的关系。
  • 哈希表(Hash Table):通过哈希函数来计算数据的存储位置,以实现快速的数据查找。

当下看的话可能会觉得像希哈表的概念很高级,后面会慢慢接触到的,需要有一定的C语言的基础尤其是指针等方面

二、复杂度

1.空间复杂度

衡量一个程序在执行的过程中产生的存储空间的消耗,空间复杂度越小越好,但当下对于空间复杂度的要求相对来说没有时间复杂度那么高,因为当下存储空间并不紧张,所以一般我们会优先考虑时间复杂度尽可能小,会牺牲空间来成全时间。

空间复杂度的计算通常考虑以下几方面:

  1. 程序代码本身占用的空间:这部分空间通常是不变的,与输入规模无关。

  2. 输入数据占用的空间:在计算空间复杂度时,通常不考虑输入数据占用的空间,因为输入数据的大小通常是由问题本身决定的。

  3. 临时变量占用的空间:这包括算法执行过程中临时创建的变量、数据结构等所占用的空间。

  4. 递归栈占用的空间:如果算法使用了递归,那么递归的深度会影响栈空间的使用。

2.时间复杂度

时间复杂度通常用大O符号(O-notation)表示(模糊估计),记作O(f(n)),其中f(n)是关于输入规模n的一个函数,用来描述算法运行时间相对于输入规模的增长率。这里的关键是算法运行时间的增长率,而不是实际的运行时间,因为不同的计算机和环境会导致实际的运行时间差异很大。

以下是一些常见的时间复杂度类别:

  1. 常数时间 O(1):算法的运行时间不随输入规模n的变化而变化。例如,访问数组中的单个元素。

  2. 对数时间 O(log n):算法的运行时间随着输入规模的增长而减少。例如,二分查找(log_2n)算法。

  3. 线性时间 O(n):算法的运行时间与输入规模n成线性关系。例如,遍历一个数组。

  4. 线性对数时间 O(n log n):算法的运行时间是输入规模n与n的对数的乘积。例如,快速排序的平均时间复杂度。

  5. 二次时间 O(n^2):算法的运行时间与输入规模的平方成正比。例如,冒泡排序(等差)或选择排序。

  6. 多项式时间 O(n^k):算法的运行时间与输入规模的k次幂成正比,其中k是一个常数。例如,k>2的排序算法。

  7. 指数时间 O(2^n):算法的运行时间以指数方式增长。例如,解决旅行商问题的蛮力算法(目前还没学过)。


总结

今天主要是针对刚刚学习的知识进行一个简单的总结,以备后面复习,自己的理解结合AI生成,更为重要的是要自己去敲一些代码,斐波那契递归、冒泡排序、二分法查找等一些代码要自己写一下整理一下思路

  • 32
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值