开发者社区> 问答> 正文

数据结构中算法的时间和空间复杂度怎么计算

数据结构中算法的时间和空间复杂度怎么计算

展开
收起
知与谁同 2018-07-21 17:35:39 2039 0
2 条回答
写回答
取消 提交回答
  • 排序算法 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 分类 在计算机科学所使用的排序算法通常被分类为: 计算的复杂度(最差、平均、和最好表现),依据串列(list)的大小(n)。一般而言,好的表现是O。(n log n),且坏的行为是Ω(n2)。对於一个排序理想的表现是O(n)。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要Ω(n log n)。 记忆体使用量(以及其他电脑资源的使用) 稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。也就是一个排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的串列中R出现在S之前,在排序过的串列中R也将会是在S之前。 一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序(bubble sort)和快速排序(quicksort)。选择排序包含shaker排序和堆排序(heapsort)。 当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。 (4, 1) (3, 1) (3, 7) (5, 6) 在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有: (3, 1) (3, 7) (4, 1) (5, 6) (维持次序) (3, 7) (3, 1) (4, 1) (5, 6) (次序被改变) 不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地时作为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个物件间之比较,就会被决定使用在原先资料次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。 排列算法列表 在这个表格中,n是要被排序的纪录数量以及k是不同键值的数量。 稳定的 冒泡排序(bubble sort) — O(n2) 鸡尾酒排序 (Cocktail sort, 双向的冒泡排序) — O(n2) 插入排序 (insertion sort)— O(n2) 桶排序 (bucket sort)— O(n); 需要 O(k) 额外 记忆体 计数排序 (counting sort) — O(n+k); 需要 O(n+k) 额外 记忆体 归并排序 (merge sort)— O(n log n); 需要 O(n) 额外记忆体 原地归并排序 — O(n2) 二叉树排序 (Binary tree sort) — O(n log n); 需要 O(n) 额外记忆体 鸽巢排序 (Pigeonhole sort) — O(n+k); 需要 O(k) 额外记忆体 基数排序 (radix sort)— O(n·k); 需要 O(n) 额外记忆体 Gnome sort — O(n2) Library sort — O(n log n) with high probability, 需要 (1+ε)n 额外记忆体 不稳定 选择排序 (selection sort)— O(n2) 希尔排序 (shell sort)— O(n log n) 如果使用最佳的现在版本 Comb sort — O(n log n) 堆排序 (heapsort)— O(n log n) Smoothsort — O(n log n) 快速排序 (quicksort)— O(n log n) 期望时间, O(n2) 最坏情况; 对於大的、乱数串列一般相信是最快的已知排序 Introsort — O(n log n) Patience sorting — O(n log n + k) 最外情况时间, 需要 额外的 O(n + k) 空间, 也需要找到最长的递增子序列(longest increasing subsequence) 不实用的排序算法 Bogo排序 — O(n × n!) 期望时间, 无穷的最坏情况。 Stupid sort — O(n3); 递回版本需要 O(n2) 额外记忆体 Bead sort — O(n) or O(√n), 但需要特别的硬体 Pancake sorting — O(n), 但需要特别的硬体 排序的算法 排序的算法有
    2019-07-17 22:53:41
    赞同 展开评论 打赏
  • 社区管理员
    你好.T(n)=O( f (n) )  表示时间问题规模n的增大,算法执行时间 的增长率和f(n)的增长率相同.称作 时间复杂度.如下:1. {++x;s=0}2. for (i=1;i<=n;++i) { ++x; s+=x;}3. for ( j=1; j<=n;++j ) for (k+1;j<=n;++k) { ++x;s+=x;}基本操作“x增1”的语句的频度分别为1.n和n的平方.则这三个程序段的时间复杂度分别 为.O(1). O(n)..O(n平方).分别为常量阶.线性阶.和平方阶...算法可能呈现 的时间 复杂度还有对数阶O(long n) .指数阶O(2 n方)等 .空间复杂度:  s(n)=O(f(n))其中n为问题的规模(或大小).一个上机执行的程序 除了需要存储空间来寄存本身所用指令.常数.变量和输入数据外.也要一些对数据进行操作 的工作单元和存储一些为实现计算所需信息的空间.若输入数据所占的空间只取决于问题本身,和算法无关,则只要分析除输入和程序之处的额处空间,否则应同时考虑输入本身所需空间...有点抽象...因为本人也学不好.所以.只能回答这些..见谅..
    2019-07-17 22:53:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
【云栖精选7月刊】抛开晦涩的算法、模型,让我们来谈谈互联网架构 立即下载
聚星台—客户运营核心大数据 与算法技术 立即下载
Apache Flink 流式应用中状态的数据结构定义升级 立即下载