时间复杂度杂谈

1、关于时间复杂度

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。举例,如果一个算法对于任何大小为的输入,它至多需要的时间运行完毕,那么它的渐近时间复杂度是

2、常用的时间复杂度列表

名称 复杂度类 运行时间( 运行时间举例 算法举例
常数时间   10 判断一个二进制数的奇偶
阿克曼时间     并查集的单个操作的平摊时间
迭代对数时间     en:Cole-Vishkin algorithm
对数对数时间     有界优先队列的单个操作[1]
对数时间 DLOGTIME 二分搜索
幂对数时间    
(小于1次)幂时间   ,其中 K-d树的搜索操作
线性时间   无序数组的搜索
线性迭代对数时间     Raimund Seidel三角分割多边形算法
线性对数时间   最快的比较排序
二次时间   冒泡排序插入排序
三次时间   矩阵乘法的基本实现,计算部分相关性
多项式时间 P 线性规划中的en:Karmarkar‘s algorithmAKS质数测试
准多项式时间 QP   关于有向斯坦纳树问题最著名的近似算法
次指数时间(第一定义) SUBEXP ,对任意的ε > 0 Assuming complexity theoretic conjectures, BPP is contained in SUBEXP.[2]
次指数时间(第二定义)   2o(n 2n1/3 Best-known algorithm for integer factorization and graph isomorphism
指数时间 E 2O(n) 1.1n, 10n 使用动态规划解决旅行推销员问题
阶乘时间   O(n!) n! 通过暴力搜索解决旅行推销员问题
指数时间 EXPTIME 2poly(n) 2n, 2n2  
双重指数时间 2-EXPTIME 22poly(n) 22n Deciding the truth of a given statement in Presburger arithmetic

3、复杂度举例

* O(1) 常数级复杂度,也就是说程序运行的时间与需要处理的数据大小无关。通常把比较大小、加减乘除等简单的运算都当做常数级复杂度。 值得注意的是,在处理大数(二进制下数据长度超过32位或者十进制下超过8位)时,将加减乘除等运算当做常数复杂度不再适用。

* O(log n) 将一个10进制整数转化为2进制整数

* O(n):判断一个元素是否属于一个大小为n的集合/列表;找出n个数中的最大值;

* O(n * log n) 快速排序法

* O(n^2) 最直白的两两比较然后排序方法,需要n*(n-1)/2次比较,所以是O(n^2)级。

* O(2^n) 列出所有长度为n的0,1字符串之类的穷举计算

* O(n!) 列出n个元素的全排列之类的穷举计算

4、对数时间

若算法的T(n) = O(log n),则称其具有对数时间。由于计算机使用二进制的记数系统,对数常常以2为底(即log2 n,有时写作lg n)。然而,由对数的换底公式,loga n和logb n只有一个常数因子不同,这个因子在大O记法中被丢弃。因此记作O(log n),而不论对数的底是多少,是对数时间算法的标准记法。

常见的具有对数时间的算法有二叉树的相关操作和二分搜索。

对数时间的算法是非常有效的,因为每增加一个输入,其所需要的额外计算时间会变小。

递归地将字符串砍半并且输出是这个类别函数的一个简单例子。它需要O(log n)的时间因为每次输出之前我们都将字符串砍半。 这意味着,如果我们想增加输出的次数,我们需要将字符串长度加倍。

// 递归输出一个字符串的右半部分
var right = function(str)
{
    var length = str.length;

    // 辅助函数
    var help = function(index)
    {

        // 递归情况:输出右半部分
        if(index < length){

            // 输出从index到数组末尾的部分
            console.log(str.substring(index, length));

            // 递归调用:调用辅助函数,将右半部分作为参数传入
            help(Math.ceil((length + index)/2));
        }

        // 基本情况:什么也不做
    }
    help(0);
}

本文参考的维基百科中对“时间复杂度”的描述。
时间: 2024-11-05 10:22:59

时间复杂度杂谈的相关文章

lucene&amp;nbsp;分词的一些杂谈

找遍了网上所有的中文的分词工具,没有一个可以拿来用的,所以决定还是自己做一个分词的工具把,分词的核心功能: 1.分词基础算法(常见的有正向最大,逆向最大,最多分词,基于统计,基于理解即无词库分词等,当然一个好的搜索引擎必然是基于多种分词方式的) 2.是否支持强制一元分词:这个是商业的搜索引擎必备的. 3.同义词识别,简体中文和繁体中文的识别对应转换,中文和拼音的互转 4.支持中文分词的时候是否考虑好了英文的处理:难免会遇到英文文档,和中英混合的文档 5.特殊内容的处理: 邮箱处理.电话号码的处理

在O(n)时间复杂度内找到出现超过一半的数

#include<iostream> using namespace std; bool solver(const int a[],const int n, int & num) { if(NULL == a || 0>= n) return false; ////注意,是小写~ int count = 0; int com = a[0]; for(int i = 1;i<n;i++) { if(0 == count) { com = a[i]; count++; } el

数据结构——时间复杂度

分析算法的时间复杂度: 算法的时间复杂度就是反应了程序执行时间随着输入规模增长而增长的量级,这个标准可以很好的反映出算法的优劣性质. 算法的频度: 一个算法执行所耗费的时间完全可以以程序执行的次数进行估算,程序执行的次数越多,时间复杂度也就越复杂,也就是说算法花费的时间与算法中语句执行的次数成正比例,因此,一个算法中语句执行的次数可以叫做时间频度.记为T(n). 时间复杂度: 由于n表示规模,当n不断变化的时候,T(n)也会随之不断变化,当我们需要知道他的变化趋势的时候,就要引入时间复杂度.一般

如何计算时间复杂度

本文是转载的,原作者不详. 一.概念 时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数) 比如:一般总运算次数表达式类似于这样: a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f a ! =0时,时间复杂度就是O(2^n); a=0,b<>0 =>O(n^3); a,b=0,c<>0 =>O(n^2)依此类推 eg: (1) for(i=1;i<=n;i++) //循环了n*n次,当然是O(n^2) for(j=1;j<=

leetcode链表--13、median-of-two-sorted-arrays(两个排序数组的中位数,时间复杂度)

题目描述 There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). 题目解析:本题关键之处在于时间复杂度要求为O(log(m+n)),本题如果采用合并并排序两数组的方式,时间复杂度为O((m+n)*log(n+m))但是在牛客网上

时间复杂度

一概念 时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数) 比如:一般总运算次数表达式类似于这样: a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f a ! =0时,时间复杂度就是O(2^n); a=0,b<>0 =>O(n^3); a,b=0,c<>0 =>O(n^2)依此类推 二.计算方法 1.一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花

统计数组[1-n]中各个元素出现的次数,时间复杂度O(n),空间复杂度O(1),可改变数组结构

* 统计数组中每个元素出现的次数 * 数组长度为N,每个元素范围为[1,N]. * 统计各个元素出现的次数,要求时间复杂度为O(N),空间复杂度为O(1).可以修改数组中元素的值. * * 思路:遍历到每一个元素,将该(元素值 - 1)作为下标值,将该下标的元素赋值(若为正,赋值-1:若为负值,-1) * 最后,每个下标中存储的元素即为统计次数,而下标+1即为元素值. 代码: public static void main(String[] args) { // TODO Auto-genera

算法 笔记1 时间复杂度计算

评价一个算法的优劣应该从三个方面判断 1.时间复杂度 : 执行算法所耗费的时间,即时间复杂度 2.空间复杂度 : 执行算法所耗费的存储空间,主要是辅助空间 3.可读性和可操作性 : 算法应当易于理解,易于编程,易于调试等 时间复杂度 一般情况下,将算法所要求求解问题的输入量称为问题的规模,并用一个正整数n来表示 T(n)就是该算法的时间耗费,他是该算法所求问题规模n的函数 算法中基本操作重复执行的次数时问题规模n的某个函数f(n) 算法的时间量度记为: T(n) = O(F(n)) 时间复杂度的

数据结构杂谈(一)浅谈基本排序算法

0.基本概念 记录:待排序的项目 关键词:决定排序结果 稳定性:相同关键词的记录保持原来的相对次序 1.1插入排序(Insertion Sort) 算法思想 一种简单直观的排序算法,工作原理是通过构建有序序列:对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法描述 具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于