数据结构与算法(一):数据结构&时间空间复杂度

168 阅读2分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

数据结构

数据结构是数据的组织、管理和存储格式,目的是为了高效的访问和修改数据

线性结构

  • 线性结构是最简单的数据结构,包括数组、链表、以及由它们衍生出来的栈、队列、哈希表

  • 树是相对复杂的数据结构,其中比较代表性的是二叉树、以及由它衍生出来的二叉堆之类的数据结构

  • 图是更为复杂的数据结构,因为在图中会衍生出多对多的关联关系

其它数据结构

  • 有一些由上面几种基本数据结构变形而来的数据结构。比如跳表、哈希链表、位图等等

时间复杂度

  • 时间复杂度是对一个算法运行时间长短的量度,用大O表示,记作T(n)=O(f(n))。

渐进时间复杂度,也可用大O表示法

  • 若存在函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称为O(f(n)),O为算法的渐进时间复杂度,简称为时间复杂度。

常见时间复杂度

  • O(1):常量关系,即运算时间不随数据规模n的变化而变化
  • O(logn):随着数据规模n的增长与时间呈对数关系
  • O(n):随着数据规模n的增长与时间呈线性关系
  • O(n²):随着数据规模n的增长与时间呈n²关系 还有
  • O(nlogn)
  • O(n³)
  • O(mn)
  • O(n!)

空间复杂度

常见空间复杂度关系

  • O(1):当算法空间固定,与输入规模无直接关系

  • O(n):当算法分配的空间是一个线性的集合如数组,并且集合的大小和输入的规模n成正比

  • O(n²):当算法分配的空间是一个二维数组集合,并且集合的宽度和长度都与输入的规模n成正比

  • 递归空间:递归是一个比较特殊的场景、虽然代码中并无显示声明变量或者集合、但是计算机在执行程序时,会专门分配一块内存,用来存储方法调用栈,它包括进栈和出栈两个行为。递归所需要的空间和递归深度的深度成正比,空间复杂度为O(n)

参考

漫画算法:小灰的算法之旅