算法简介:
算法分析是关于计算机性能和资源利用的理论研究。在程序设计方面,个人认为比性能更重要的有正确性,简洁,可维护性,成本(时间成本,资金成本等),健壮性,特性,功能性,安全性,用户友好性等。
但关心性能主要因为:
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个数字以下,可能插入排序快于归并排序
如果有不正确的地方,欢迎大家补充,互相学习。
发表评论
-
【转】多线程
2012-04-05 16:49 872多线程线程:是指进程中的一个执行流程。线程与进程的区别:每个进 ... -
算法导论学习笔记四---快速排序及随机化算法
2012-02-04 11:27 6134算法特点: 1.分治法设计 2.节省内存 3.非常实用 ... -
算法导论学习笔记三之分治法与递归式解法
2012-02-02 10:53 3194分治法概念: 分治法:将原问题分成n个规模较小而结构与原问题 ... -
java与osgi入门篇
2012-02-01 00:20 2074今天同学问起来OSGI的问题,我之前没接触过,所以搜索了一下, ... -
算法学习笔记二---如何进行算法分析&渐近符号介绍
2012-01-10 22:28 5539一、如何进行算法分析 算法分析指对一个算法需要的资源进 ... -
有效和正确定义hashCode()和equals()
2011-12-19 16:31 1755hashCode方法的作用: 总 ... -
java读取excel数据 需要poi组件
2010-07-19 14:42 2993Apache POI是Apache软件基金会的开放源码函式库, ... -
DIV+CSS 滑动门技术的简单例子
2010-01-28 09:43 201<!DOCTYPE html PUBLIC " ... -
经常要用的JavaScript字符串处理函数
2009-12-23 09:38 912函数:split() 功能:使用一个指定的分隔符把一个字符串 ... -
java日期处理
2009-11-30 14:38 984package com; import java.text. ... -
file转String
2009-11-03 14:56 2337public static String loadAFileT ... -
java读取xml
2009-11-03 14:52 981package webcontroller.dbsx; ... -
ejb3.0初体验,部署真麻烦~~~~
2009-05-24 19:28 185本人用的EJB容器是JBOSS,首先JBOSS的安装也有讲究。 ... -
MyEclipse 6.5 注册码
2008-12-06 15:01 1976import java.io.BufferedReade ...
相关推荐
算法导论 学习笔记
《算法导论》学习笔记 有详细的和清晰的板书,非常好的东西
算法导论授课教案、作业、解答等等 很全的资料 整理在一个网站,我整个抓了下来,作成离线版 学习算法的同学必备!
《算法导论》读书笔记_附录A习题解答 学习C C++ 资料
麻省理工学院算法导论_笔记 算法导论,学习计算机必备
包括麻省理工学院算法课的教材《算法导论》中英文版,麻省理工的课堂讲义,练习,以及课后答案,值得学习算法的学生研究。
麻省理工的关于算法导论的笔记,英文版 希望对学习算法导论的朋友能有帮助
《算法导论》学习笔记_,针对有需要的童鞋提供下载
1 全世界唯一带“完整”目录的《算法导论》第二版中文版 2 目前能找到的多个版本的习题答案和代码 有Java实现的 C++实现的 官方的 非官方的 教参 考试题答案等等 3 讲义 4 算法导论第二版最清晰的英文版 文字...
本资源有算法导论第四版及其课后答案,也有一些学习笔记
NULL 博文链接:https://deepin.iteye.com/blog/1390131
这是一本经典的算法导论的书,里面覆盖的知识点十分广泛,通过此书,你可以更好的理解算法的知识。
MIT公开课OpenCourseWare 6.046J,课堂笔记手写稿,自己学习时记录的笔记,每一讲都有详细记录
上海交大 机器学习导论 主讲教师:张志华 主要内容包含: 1.再生核 2.数据降维 3.EM算法 4.多维标度 5.矩阵补充 6.聚类方法 7.判别分析 8.线性分类 9.生成模型 10.支持向量机 11.提升方法
《算法导论》将严谨性和全面 性融为一体。.. 本书深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。各章自成体系,可以作为独立的学习单元。算法 以英语和伪代码的形式描述,具备初步程序...
clrs-notes-solutions, 算法导论,第3版,学习笔记,习题答案
计算机算法导论 学习笔记 有用 可以看看
Introduction to Algorithm是MIT(麻省理工学院)学生学习算法的必修课程,这里就是学习的笔记。教程因为受到上传文件容量的限制,无法上传,感到很可惜!
动态规划学习笔记 // /经典问题/状态表示/状态转移方程 https://blog.csdn.net/weixin_37863080/article/details/103261838 和上文配套使用更佳
“学习笔记”之《算法导论》----第六部分----图算法----第二十六章----最大流-附件资源