数据结构与算法-如何计算时间复杂度

今天我们来谈一下如何计算时间复杂度。

时间复杂度概念:(百度版)

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。

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

注意:本文承接上一篇《数据结构与算法-函数的渐近增长》,想详细了解渐近增长,请点击:数据结构与算法-函数的渐近增长

现在先上代码,请大家详细阅读注释,因为整个计算过程都已经在注释里面体现。

/**
 * 计算时间复杂度
 *
 * @author ray
 *
 */
public class Test {

	private void test1(int n) {
		System.out.println(n);// 操作=1
	}

	private void test2(int n) {
		int a = 0;
		for (int i = 0; i < n; i++) {// 操作=n
			a++;// 操作=1
		}
		// 总操作=n*1=n
		// 时间复杂度=O(1)
	}

	private void test3(int n) {
		int a = 0;
		for (int i = 0; i < n; i++) {// 操作=n
			for (int j = 0; j < n; j++) {// 操作=n
				a++;// 操作=1
			}
		}
		// 总操作=n*n*1=n^2
		// 时间复杂度=O(n^2)
	}

	private void test4(int n) {
		int a = 0;
		for (int i = 0; i < n; i++) {
			for (int j = i; j < n; j++) {// 操作=n,n-1,n-2,n-3......1=(n+1)n/2
				a++;// 操作=1
			}
		}
		// 总操作=(n+1)n/2=n^2/2+n/2
		// 由于时间复杂度是一个抽象的概念,当n的规模达到一定程度的时候,时间复杂度只取最高次幂,而且忽略其他次要项和系数
		// 时间复杂度=O(n^2)
	}

	private void test5(int n) {
		int a = 0;
		for (int i = 0; i < n; i++) {
			for (int j = i; j < n; j++) {// 操作=n,n-1,n-2,n-3......1=(n+1)n/2
				a++;// 操作=1
				System.out.println(a);// 操作=1
				// for循环内总操作=2
			}
		}
		// 总操作=(n+1)n/2*2=n^2+n
		// 由于时间复杂度是一个抽象的概念,当n的规模达到一定程度的时候,时间复杂度只取最高次幂,而且忽略其他次要项和系数
		// 时间复杂度=O(n^2)
	}

	private void test6(int n) {
		int a = 0;
		for (int i = 0; i < n; i++) {
			for (int j = i; j < n; j++) {// 操作=n,n-1,n-2,n-3......1=(n+1)n/2
				a++;// 操作=1
				System.out.println(a);// 操作=1
				System.out.println(i);// 操作=1
				// for循环内总操作=3
			}
		}
		// 总操作=(n+1)n/2*3=n^2*3/2+n*3/2
		// 由于时间复杂度是一个抽象的概念,当n的规模达到一定程度的时候,时间复杂度只取最高次幂,而且忽略其他次要项和系数
		// 时间复杂度=O(n^2)
	}

	private void test7(int n) {
		int a = 0;
		int b = 0;
		for (int i = 0; i < n; i++) {// 操作=n
			for (int j = 0; j < n; j++) {// 操作=n
				a++;// 操作=1
				System.out.println(a);// 操作=1
				// for循环内总操作=2
				for (int k = 0; k < n; k++) {// 操作=n
					b++;// 操作=1
					// for循环内总操作=1
				}
			}
		}
		// 总操作==n^3+2n^2
		// 由于时间复杂度是一个抽象的概念,当n的规模达到一定程度的时候,时间复杂度只取最高次幂,而且忽略其他次要项和系数
		// 时间复杂度=O(n^3)
	}

	public static void main(String[] args) {
		int n = 10;
		Test t = new Test();
		t.test1(n);
		t.test2(n);
		t.test3(n);
		t.test4(n);
		t.test5(n);
		t.test6(n);
		t.test7(n);
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-04 12:02:13

数据结构与算法-如何计算时间复杂度的相关文章

数据结构和算法之时间复杂度和空间复杂度

前言 上一篇<数据结构和算法>中我介绍了数据结构的基本概念,也介绍了数据结构一般可以分为逻辑结构和物理结构.逻辑结构分为集合结构.线性结构.树形结构和图形结构.物理结构分为顺序存储结构和链式存储结构.并且也介绍了这些结构的特点.然后,又介绍了算法的概念和算法的5个基本特性,分别是输入.输出.有穷性.确定性和可行性.最后说阐述了一个好的算法需要遵守正确性.可读性.健壮性.时间效率高和存储量低.其实,实现效率和存储量就是时间复杂度和空间复杂度.本篇我们就围绕这两个"复杂度"展开

python数据结构与算法(1)---时间复杂度

一.数据结构基础 1.数据结构概念 就是一组数据在内存中的存储形式,也是对基本数据类型的一次封装 也是数据对象中数据元素之间的关系. 算法与数据结构的区别: 数据结构只是静态的描述了数据元素之间的关系 高效的程序需要在数据结构的基础上设计和选择算法 程序=数据结构+算法 总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题的载体. 2.抽象数据类型(ADT) 就是将数据类型和数据类型上的运算捆在一起,进行封装,相当于类 3.算法效率的衡量 实现算法程序的执行时间可以反映出算法的效率

【数据结构与算法】时间复杂度的计算

算法时间复杂度的计算 [整理] 博客分类: 算法学习 时间复杂度算法 基本的计算步骤  时间复杂度的定义     一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数.记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度. 根据定义,可以归纳出基本的计算步骤 1. 计算出基本操作的执行次

数据结构与算法之线性表

前言 上一篇<数据结构和算法之时间复杂度和空间复杂度>中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明.这一篇主要介绍线性表. 线性表属于数据结构中逻辑结构中的线性结构.回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构.几何结构.树形结构和图形结构四大结构.其中,线性表就属于线性结构.剩余的三大逻辑结构今后会一一介绍. 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列. 注意: 1.线性表是一个序列. 2.0个元素构成的线性表是空表.

数据结构与算法-怎样计算时间复杂度

今天我们来谈一下怎样计算时间复杂度. 时间复杂度概念:(百度版) 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率. 算法分析的目的在于选择合适算法和改进算法. 计算机科学中,算法的时间复杂度是一个函数,它定量描写叙述了该算法的执行时间. 这是一个关于代表算法输入值的字符串的长度的函数.时间复杂度经常使用大O符号表述,不包含这个函数的低阶项和首项系数.使用这样的方式时.时间复杂度可被称为是渐近的.它考察当输入值大小趋近无穷时的情况. 注意:本文承接上一篇<数据结构与算法-

数据结构和算法-时间复杂度和空间复杂度

[算法时间复杂度的定义] 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间量度,记作:T(n) = O(f(n)).它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度.其中f(n)是问题规模n的某个函数. 即:执行次数=时间 [如何分析一个算法的时间复杂度?即:如何推到大O阶呢?] -用常数1取代运行时间中的所有加法常数 -在修改

数据结构与算法题整理

未经各位前辈允许,擅自整理,还望谅解.感激不尽. ↓↓↓↓一一一2016.9.23 如何计算时间复杂度 平均查找长度详解 ↓↓↓↓一一一2016.9.15 找工作知识储备(3)---从头说12种排序算法:原理.图解.动画视频演示.代码以及笔试面试题目中的应用(该博主博客很多面试数据结构与算法方面的干货!推荐!) 找工作笔试面试那些事儿(15)---互联网公司面试的零零种种和多家经验(同为该博主,这篇讲大纲) ↓↓↓↓一一一2016.9.14 微软公司等数据结构+算法面试100题(第1-100题)

8 数据结构与算法

8.1 链表 8.1.1 如何实现单链表的增删操作 8.1.2 如何从链表中删除重复的数据 如何从链表中删除重复数据,最容易想到的方法就是遍历链表,把遍历到的值存储到一个Hashtable中,在遍历过程中,若当前访问的值在Hashtable中已经存在,则说明这个数据是重复的,因此就可以删除. 主要思路为对链表进行双重循环遍历,外循环正常遍历链表,假设外循环当前遍历的结点为cur,内循环从cur开始遍历,若碰到与cur所指向结点值相同,则删除这个重复结点. 8.1.3 如何找出单链表中的倒数第K个

数据结构与算法1

数据结构与算法(一),概述 转载请注明出处:http://www.cnblogs.com/wangyingli/p/5919297.html 数据结构学了有一年的时间了,但是一直没有好好的总结一下,现在回想起来,感觉好像都不怎么记得了.所以接下来一段时间我将重新学习一下,算是温故而知新了.本着「分享是一种美德」的精神,我将把我的学习总结记录下来,并与大家分享. 本节的主要内容有: 一.数据结构 1.定义 2.关于数据结构的几个术语 3.逻辑结构与物理结构 二.抽象数据类型 三.算法 四.算法的复