`

算法导论学习笔记一

 
阅读更多

 

算法简介:

      算法分析是关于计算机性能和资源利用的理论研究。在程序设计方面,个人认为比性能更重要的有正确性,简洁,可维护性,成本(时间成本,资金成本等),健壮性,特性,功能性,安全性,用户友好性等。

但关心性能主要因为:

1.性能直接决定着软件开发的可行还是不可行,例如,对于实时的需求,程序不够快,表示着不可行,如果占用太多内存,也只能说不可行,所以算法总是处于解决问题的最前沿。

2.算法是一种描述程序行为的语言,计算机科学家尼克劳斯-沃思曾著过一本著名的书《数据结构十算法= 程序》,可见算法在计算机科学界与计算机应用界的地位。

那么算法在程序设计中扮演的角色,打个比方,它所扮演的角色就如同经济中的货币一般,在这基础上,你才能买你的生活所需用品比如水,食物。同理,有了算法,你才能在性能良好上基础上,构建软件的扩展性,用户友好性等等。

 

算法运行多长时间往往取决于:

1.输入值本身决定(比如已经排序好的,运行比较快)

2.输入值数量的多少

3.计算机运行速度

 

但是,接下来讨论的,在同等的输入值,输入数量和计算机运行速度上,一个算法的评价主要从时间复杂度和空间复杂度来考虑。

 

时间复杂度

  算法的时间复杂度是指执行算法所需要的时间。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做

  T(n)=Ο(f(n))

  因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

按数量级递增排列,常见的时间复杂度有:

  常数阶O(1),对数阶O(log2n)(以2为底n的对数,下同),线性阶O(n),

  线性对数阶O(nlog2n),平方阶O(n^2),立方阶O(n^3),...,

  k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。

空间复杂度

  算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

 

 

以下举例说明不同算法间的时间复杂度影响效率,分别用直接插入法和归并排序给大家做个试验,代码如下:

 

import java.util.Random;

/*
 * Author by Deepin
 * 2012-1-7
 */

public class Algorithm {

	/*
	 * 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
	 * 时间复杂度:T(n)=O(n^2)
	 * 在规模较小的情况下,都使用插入排序法来进行排序
	 */
	public static void insertSort(int[] sort) {

		int j; // 定为比较得元素
		for (int i = 1; i < sort.length; i++) { // 扫描次数为sort.length-1
			int temp; // temp用来暂存数据
			temp = sort[i];
			j = i - 1;
			while (j >= 0 && temp < sort[j]) { // 如果第二个元素小于第一个元素
				sort[j + 1] = sort[j]; // 把所有的元素往后推一个位置
				sort[j] = temp; // 最小的元素放到第一个位置
				j--;
			}

		}
	}

	/*
	 * 归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件 
	 * T(n)=2T(n/2)+O(n), if(n>1)
	 */
	public static void mergeSort(int[] data) {

		int[] temp = new int[data.length];
		merge(data, temp, 0, data.length - 1);
	}

	private static void merge(int[] data, int[] temp, int l, int r) {
		int mid = (l + r) / 2;
		if (l == r)
			return;
		merge(data, temp, l, mid);
		merge(data, temp, mid + 1, r);
		for (int i = l; i <= r; i++) {
			temp[i] = data[i];
		}
		int i1 = l;
		int i2 = mid + 1;
		for (int cur = l; cur <= r; cur++) {
			if (i1 == mid + 1)
				data[cur] = temp[i2++];
			else if (i2 > r)
				data[cur] = temp[i1++];
			else if (temp[i1] < temp[i2])
				data[cur] = temp[i1++];
			else
				data[cur] = temp[i2++];
		}
	}

	public static void main(String[] args) {
		Random random = new Random();
		for (int sortSize = 100; sortSize < 100001; sortSize *= 10) {
			int[] sort = new int[sortSize];
			
			for (int i = 0; i < sortSize; i++) {
				sort[i] = random.nextInt(100001);
			}
			long startTime = System.currentTimeMillis();
			Algorithm.insertSort(sort);
			long endTime = System.currentTimeMillis();
			System.out.println("插入算法:sortSize为" + sortSize + "排序总共运行了:"
					+ (endTime - startTime) + "毫秒");

			startTime = System.currentTimeMillis();
			Algorithm.mergeSort(sort);
			endTime = System.currentTimeMillis();
			System.out.println("排序算法:sortSize为" + sortSize + "排序总共运行了:"
					+ (endTime - startTime) + "毫秒");

			System.out.println("----------------------------------------");

		}
	}

}

 运行结果:

 

插入算法:sortSize为100排序总共运行了:0毫秒
排序算法:sortSize为100排序总共运行了:0毫秒
----------------------------------------
插入算法:sortSize为1000排序总共运行了:3毫秒
排序算法:sortSize为1000排序总共运行了:0毫秒
----------------------------------------
插入算法:sortSize为10000排序总共运行了:53毫秒
排序算法:sortSize为10000排序总共运行了:1毫秒
----------------------------------------
插入算法:sortSize为100000排序总共运行了:5632毫秒
排序算法:sortSize为100000排序总共运行了:14毫秒
----------------------------------------

 

得出结论:归并排序在一个充分大的输入规模下将优于插入排序,因为T(n)=2T(n/2)+O(n)<T(n)=O(n^2)

但在小输入规模下,比如30个数字以下,可能插入排序快于归并排序

 

如果有不正确的地方,欢迎大家补充,互相学习。

分享到:
评论

相关推荐

    算法导论 学习笔记.pdf

    算法导论学习笔记 本资源是对《算法导论》的学习笔记,涵盖了算法的基础知识、算法分析、函数的增长、递归式等方面的内容。 一、算法基础知识 算法是指将输入转换为输出的一系列计算步骤,目的是为了有效利用...

    算法导论授课教案学习笔记

    这份"算法导论授课教案学习笔记"是针对该书的深入学习资源,包括了教学教案、课后作业及解答,对于正在学习算法的学生来说,无疑是一份极其宝贵的参考资料。 教程部分可能涵盖以下知识点: 1. **算法基础**:介绍...

    算法导论读书笔记

    《算法导论》是计算机科学领域的一本经典之作,它深入浅出地介绍了算法的设计、分析和实现。这本书的第二到第八章涵盖了诸多基础且重要的算法知识,是学习算法的基石。以下是对这些章节主要内容的详细解读: 第二章...

    算法导论 读书笔记

    在本读书笔记中,涉及到的算法知识点主要包含在《算法导论》的附录A习题解答中,内容涵盖等差级数求和、调和级数性质、无穷递减几何级数、求和的渐近上界及下界、积分求近似值以及思考题中求和的界等问题。...

    《算法导论》学习笔记

    ### 《算法导论》学习笔记关键知识点梳理 #### 第一部分:基础知识 ##### 第1章:算法在计算中的作用 1. **算法定义**:算法是一系列明确且有限的指令集合,旨在解决特定问题或执行特定任务。它可以视为将有效...

    算法导论系列读书笔记之二

    作为“算法导论系列读书笔记之二”,本文将主要探讨第二章的内容,这一章通常涵盖基础的数据结构和算法,为后续章节的学习打下坚实的基础。 在算法分析中,"循环不变式"是一个至关重要的概念。它是指在循环开始前、...

    算法导论系列读书笔记之三

    作为“算法导论系列读书笔记之三”,本文将主要探讨第三章的内容,这一章通常聚焦于排序与选择算法,这些是数据处理的基础,对理解和优化程序性能至关重要。 在第一章和第二章中,我们可能已经接触到了基本的数据...

    算法导论系列读书笔记之六

    《算法导论》系列读书笔记之六主要涵盖了优先级队列、堆排序以及大根堆和最大堆等重要概念。这些知识点在计算机科学与技术领域,尤其是数据结构和算法分析中占据着核心地位。下面将对这些内容进行深入的探讨。 ...

    麻省理工算法导论及笔记

    《算法导论》是计算机科学领域的一本经典著作,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同编写。这本书深入浅出地介绍了各种基础和高级算法,为学生和研究人员提供了...

    算法导论学习笔记三之分治法与递归式解法

    **算法导论学习笔记三之分治法与递归式解法** 在计算机科学中,分治法(Divide and Conquer)和递归式(Recursive Formulation)是解决复杂问题的强大工具。这两种方法通常相互结合,使得我们能够对大型问题进行...

    算法导论答案算法导论教师手册

    《算法导论教师手册》为教师提供了丰富的教学资源,包括详尽的讲座笔记、习题解答和案例分析,有助于教师更好地理解和传授算法知识,同时也能帮助学生深入学习,巩固理论知识,提高解决实际问题的能力。 总之,...

    算法导论读书笔记(整理别人的)

    《算法导论》是计算机科学领域的一本经典著作,它深入浅出地介绍了各种重要的算法,并提供了详尽的分析和实现。这篇读书笔记主要涵盖了以下几个方面的重要知识点: 1. **算法基础**:算法是解决问题的步骤序列,是...

    算法导论的笔记

    通过这份笔记,我们可以了解到算法导论课程的基本框架和核心内容。从课程信息、算法分析的重要性到具体的排序算法(如插入排序),这些内容为学习者提供了全面的视角来理解算法设计和分析的基础知识。特别是插入排序...

    算法导论试题及答案

    《算法导论》是计算机科学领域的一本经典教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同编写,广泛应用于全球各大高校的教学中,包括知名的麻省理工学院(MIT)。...

    麻省理工学院算法导论_笔记

    《麻省理工学院算法导论_笔记》是针对计算机科学领域内算法研究的一份详尽资料,由麻省理工学院(MIT)提供,主要聚焦于算法理论与实践的基础知识。这份资料不仅适合MIT的学生,也对全球范围内对算法感兴趣的学者、...

    MIT 算法导论 课堂笔记

    通过深入学习这本《MIT算法导论》的课堂笔记,你可以系统地掌握算法的精髓,提高解决问题的能力,为未来的编程生涯打下坚实的基础。同时,Word文档的格式使得笔记易于阅读和整理,方便你在学习过程中随时查阅和复习...

    麻省理工算法导论全套笔记

    《麻省理工算法导论全套笔记》是一份深入学习算法的宝贵资料,源自世界顶级学府麻省理工学院(MIT)的课程。这份笔记涵盖了广泛的算法主题,旨在帮助读者掌握算法设计、分析以及实现的核心概念。以下是根据提供的...

    算法导论学习资料

    再者,"算法导论(CLRS)笔记.pdf"很可能是学习者整理的学习笔记,它可能包含了个人的理解、重点摘要、解题技巧甚至是实例练习的解答。这样的笔记往往带有个人色彩,能够帮助读者从不同角度理解和掌握知识点,同时也能...

    算法导论(麻省大学还有笔记)

    《算法导论》是计算机科学领域的一本经典著作,由麻省理工学院的专家们编写,旨在深入浅出地介绍算法的设计、分析及其应用。这本书不仅涵盖了基础算法,还涉及了高级算法技巧,是学习算法的权威参考资料。描述中提到...

    算法导论系列读书笔记之附录A的习题解答

    《算法导论》是计算机科学领域的一本经典著作,它深入浅出地介绍了各种重要的算法,并提供了详尽的分析和实现。附录A通常包含了书中的习题解答,是学习和掌握书中算法的重要参考资料。这篇读书笔记将针对附录A中的...

Global site tag (gtag.js) - Google Analytics