『算法』读书笔记 1.4算法分析 Part1

Chapter 1

本章结构

1.1Java语法

1.2数据抽象

1.3集合类抽象数据类型:背包 (Bags) 、队列 (Queues) 、栈 (Stacks)

1.4算法分析

1.5连通性问题-Case Study: Union - Find ADT

 

本节开篇使用了一个ThreeSum程序进行示例:

ThreeSum所起到的作用为Count the number of triples in a file of N integers that sum to 0,简单来说,就是从N个数里面取3个数的组合,统计这些组合和为零的数量。

 

public class ThreeSum {public static int count(int[] a){int N = a.length;int cnt = 0;for (int i = 0; i < N; i++)for (int j = i+1; j < N; j++)for (int k = j+1; k < N; k++)if (a[i]+a[j]+a[k] == 0)cnt++;return cnt;}public static void main(String[] args){int[] a = In.readInts(args[0]);StdOut.println(count(a));}
}

 

与此同时,我们需要一个计时器来确定程序运行的时间,书上给出了一种计时器的实现方案,大概就是先在算法程序开始运行前先记录当前的系统时间,当算法运算完毕后,再次记录当前的系统时间,然后对两个时间进行时间差的运算便可得到整个算法所消耗的时间。

 

public class StopWatch {private final long start;public StopWatch(){    start = System.currentTimeMillis();        }public double elapseTime(){    long now = System.currentTimeMillis();return (now - start) / 1000.0;}public static void main(String[] args){int N = Integer.parseInt(args[0]);int[] a = new int[N];for (int i = 0; i < N; i++)a[i] = StdRandom.uniform(-1000000, 1000000);StopWatch timer = new StopWatch();int cnt = ThreeSum.count(a);double time = timer.elapseTime();StdOut.println(cnt + " triples " + time + " seconds ");}
}

 

D.E Knuth认为,一个程序运行的总时间主要和两点有关:

a.执行每条语句的耗时;

b.执行每条语句的频率;

如在Threesum.count()中的if语句会执行N(N-1)(N-2)/6次(由排练组合N个选3个可得)

正是这些执行最频繁的指令决定了程序运行的总时间,而这些指令也被称为程序的内循环inner loop。许多程序的运行时间往往取决于这一小部分指令的耗时。

ThreeSum运行时间分析

语句块

运行时间

频率

总时间

cnt++

t0

取决于输入x

t0*x

for对k的循环

t1

N取3的组合数

t1*C N 3

for对j的循环

t2

N取2的组合数

t2*C N 2

for对i的循环

t3

N

t3*N

count方法

t4

1

t4

总时间

上述汇总求和

近似

~(t1/6)N^3

增长的数量级

N^3

近似的概念,感觉上类似于微积分里面无穷小,即如果首项目的数量级比其他项大很多,则可以只考虑首项,因为其他幂次较低的项对最终结果的贡献几乎无关紧要。

 

至于如何对一些数学模型进行总时间的计算,作者也给了微积分方面的相应解决方案,个人觉得比用数列求和的方式做高级点。

TM截图20130125153335

事实上,为任何程序建立数学模型从理论上来说都是可行的,只不过有时候处理过程和方法会变得很复杂。

 

 

-----------------------------------------------------------------------------------------------------------------------

小结:

对于大多数程序,得到其运行时间的数学模型的步骤如下:

1.确定输入模型input model,定义问题的规模。如在ThreeSum中,输入规模即是标准输入中大小为N的整型数组a[N]。

2.识别内循环inner loop。对应回ThreeSum的例子,内循环便是三层的for循环。

3.根据内循环中的操作确定成本模型。所谓成本模型,即是算法中的基本操作。如ThreeSum的成本模型则是对数组元素的访问次数。

4.对于给定的输入,判断这些操作的执行效率。

转载于:https://www.cnblogs.com/viinye/archive/2013/01/25/2876743.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓开发工程师面试题!春招我借这份PDF的复习思路,不吃透都对不起自己

写在前面 身边有不少去大厂面试的朋友&#xff0c;其中小金面试字节跳动的经历很有意义&#xff0c;在这里分享给大家。小金是末流211计算机专业大三本科生&#xff0c;前几天面试了字节跳动的广州Android开发实习生。下面是他的面试经历&#xff0c;还有一些他自己的经验。 …

安卓开发必须会的技能!浅谈Android消息机制原理,威力加强版

目录 想要成为一名优秀的Android开发&#xff0c;你需要一份完备的知识体系&#xff0c;在这里&#xff0c;让我们一起成长为自己所想的那样。 PagerAdapter 介绍ViwePager 缓存策略ViewPager 布局处理ViewPager 事件处理相关内容 Android 基础 1.Activity 1、 什么是 Activi…

NuGet 无法连接到远程服务器-解决方法(转)

原地址&#xff1a; http://www.lixin.me/blog/2012/03/01/29362 今天打开NuGet的Manage NuGet Packages&#xff0c;显示“无法连接到远程服务器”。打开Setting-》Package Manager-》Package Sources。看到里面有一个源&#xff1a;https://go.microsoft.com/fwlink/?LinkID…

安卓开发面试书籍,全世界都在问Android开发凉了吗?建议收藏

前言 本想今年辞掉工作大干一场&#xff0c;没想到碰到疫情&#xff0c;家里蹲了3个月…&#xff0c;还好字节能给一次机会。前阵子字节跳动的提前批开始了&#xff0c;看宣传是说有海量HC&#xff0c;机会多多&#xff0c;本着涨涨面经的心理&#xff0c;然后就投递了一下杭州…

杭州集训Day5

下面是Day5的题目&#xff01;&#xff08;其实都咕了好几天了 1007040210. T1 皇后 XY 的疑难 (1s 512MB) 1.1 题目描述有一个n*n的王国城堡地图上&#xff0c;皇后XY喜欢看骑士之间的战斗&#xff0c;于是他准备布置m个骑士&#xff0c;其中每一个骑士都可以向8个方向&#x…

安卓开发面试书籍,每个程序员都必须掌握的8种数据结构!面试必会

前言 本篇文章主要记录分享我的面试准备过程。 很多朋友问我为什么离职 关于离职原因&#xff0c;马云有一句经典的话“要么钱没给到位&#xff0c;要么心委屈了”&#xff0c;想必大家耳熟能详了&#xff0c;我这里再细说一下我个人离职原因&#xff1a; 工资倒挂&#xf…

使用thinkPHP做注册程序的实例

登录界面&#xff1a; 数据库和数据表的结构 具体的操作步骤如下&#xff1a; 第一步&#xff1a;入口文件index.php内容 (此文件基本是属于固定的格式&#xff09; <?phpdefine(THINK_PATH,./ThinkPHP/);define(APP_NAME,MyApp);define(APP_PAHT,./MyApp/);require_once T…

安卓开发面试技能介绍,来一份全面的面试宝典练练手,不吃透都对不起自己

前言 网上有很多对程序员简历的一些指导&#xff0c;这里就不重述&#xff0c;大家可以搜下网上其他大神的总结&#xff0c;结合自身情况修改下。我有几点建议&#xff1a; 1.尽量不要花哨&#xff0c;程序员和设计师或者产品运营还不一样&#xff0c;我们的简历成功与否决定…

安卓开发面试题及答案,一次哔哩哔哩面试经历,年薪50W

没有稳定的工作&#xff0c;只有稳定的能力。 又到了万物复苏的季节&#xff0c;在程序猿这个行当里&#xff0c;作为 Android 开发出生的&#xff0c;在经历了八年的脱发生涯后&#xff0c;有了越来越多的想法和感触 趋势 随着各类移动跨平台的兴起&#xff0c;在 ReactNati…

安卓开发面试题!带着问题深入学习Handler,进阶学习资料!

进大厂本来就很难了&#xff0c;不过做足了准备&#xff0c;你会发现很多问题都迎刃而解了&#xff0c;当然有时候运气也占了一部分&#xff0c;除了运气以外&#xff0c;当然与我自身的努力也是分不开的。运气也是实力的一部分&#xff0c;毕竟天助自助者~ 每次到年底做总结的…

VueJS教程3

目录 13、Vue实例 13.1 动态组件&#xff08;Tab切换、简化版留言板&#xff09;13.2 使用Vue开发TodoList14、Vue CLI14.1 使用vue-cli开发TodoList接着VueJS教程2。 13、Vue实例 13.1 动态组件&#xff08;Tab切换、简化版留言板&#xff09; 参考&#xff1a;https://vuejs.…

春招我借这份PDF的复习思路,论程序员成长的正确姿势

一. 开发背景 想要成为一名优秀的Android开发&#xff0c;你需要一份完备的知识体系&#xff0c;在这里&#xff0c;让我们一起成长为自己所想的那样。 面试总结 面试大厂一定要做好充分的准备&#xff0c;没有准备就去面试完全是去当炮灰的&#xff0c;更是对自己的不负责。再…

T-SQL语句学习(三)

这部分介绍下视图、索引技术。 1、视图&#xff1a;是从一个或几个基本表&#xff08;或视图&#xff09;导出表。视图与基本表不同&#xff0c;是一个虚表。 当基本表中的数据发生变化时&#xff0c;从视图中查询出来的数据也会随之改变。 1.1 定义视图 a、创建视图的语法要求…

普通二本的辛酸Android面试之路,满满干货指导

一、自我介绍 应该算是起点比较高吧&#xff01;985大学毕业后面一直在国外读研。之前准备面试微软但是可能经验不够&#xff0c;没有通过。经过朋友介绍我准备回国&#xff0c;积累一些开发经验。于是我面试了国内大厂BATJ&#xff0c;还有一些其他比较知名的公司&#xff0c…

普通二本的辛酸Android面试之路,算法太TM重要了

前言 编程是一个江湖&#xff0c;江湖之大&#xff0c;鱼龙混杂&#xff0c;一部分江湖人士乃虾兵蟹将&#xff0c;一不小心就被一箭射死&#xff0c;我们称之为“码农”&#xff0c;这些人事江湖的重要组成部分&#xff0c;他们承担着堆砌代码&#xff0c;实现功能设计的使命…

SQL常用日期处理函数(转)

/**datepart()函数的使用 * datepart()函数可以方便的取到时期中的各个部分*如日期&#xff1a;2006-07--02 18&#xff1a;15&#xff1a;36.513* yy:取年 2006* mm:取月 7* dd:取月中的天 2* dy:取年中的天 183* wk:取…

最全的BAT大厂面试题整理,系列篇

前言 看到一篇文章中提到“最近几年国内的初级Android程序员已经很多了&#xff0c;但是中高级的Android技术人才仍然稀缺“&#xff0c;这的确不假&#xff0c;从我在百度所进行的一些面试来看&#xff0c;找一个适合的高级Android工程师的确不容易&#xff0c;一般需要进行大…

最全面试考点与面试技巧,大厂面经合集

前言 对于字节跳动的二面三面而言&#xff0c;FrameworkMVP架构HashMap原理性能优化Flutter源码分析等问题都成高频问点&#xff01;然而很多的朋友在面试时却答不上或者答不全&#xff01;今天在这分享下这些问点的视频解析给大家&#xff0c;希望对有需要的朋友有所帮助&…

阿里云sql监控配置-druid

今天我们说说数据源和数据库连接池&#xff0c;熟悉java开发的同仁应该都了解C3PO&#xff0c;在这里不做过多的赘述了&#xff0c;今天我们说的是阿里DRUID&#xff0c;druid是后起之秀&#xff0c;因为它的优秀很快占领了使用市场&#xff0c;下边我们一起来看看druid数据源的…

最全面试考点与面试技巧,真香!

写在前面 身边有不少去大厂面试的朋友&#xff0c;其中小金面试字节跳动的经历很有意义&#xff0c;在这里分享给大家。小金是末流211计算机专业大三本科生&#xff0c;前几天面试了字节跳动的广州Android开发实习生。下面是他的面试经历&#xff0c;还有一些他自己的经验。 …