`
bencode
  • 浏览: 109234 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

《算法导论》读书笔记2(复杂度的表示,递归,以及概率)

阅读更多

 这两天终于把第一部分(基础知识)给过了一遍,算是热身啦。

 

第3章:函数的增长

 

这一章主要讲了复杂度的表示方法:大O小O等。以及各类基本常用函数,像对数,指数

 

当然还有阶乘,取整,取模函数

 

还有学了计算机后才接触到的函数迭代以及 到处可见的斐波那切数

 

基本上算是把初等数学给温故了一遍。

 

第四章:递归式

 

在“笔记1”中, 我们实现了归并排序, 我们为了求比较次数,把算法简化成这样:

 

public int mergeSort2(int n) {   
	if (n == 0 || n == 1) {   
    		return 0;   
	}   
	return 2 * mergeSort2(n / 2) + n - 1;      
} 

 

   上面的函数,如果用数学公式表示,差不多是这样: T(n) = 2 T(n / 2) + n - 1  

 

~~ 我知道这个复杂度差不多是 n log(n) , 可是这个怎么来的呢?

 

这一章就主要讲了三种解递归式的方法:

1。猜(偶没实力--男人不喜欢说没能力)

2。递归树。 这个无聊了画画倒是可以的, 好用, 就是累

3。主方法。提供几种“模式”去套, 这个很方便

(书上说要记忆,其实不用记, 关键是知道有这回事,到时候翻书就行)

 

 其实上面的三种方法,对于大学的我可能还比较感兴趣,现在离学校的年代越来越远,离数学也越来越远。

 

我们程序员应该有更懒的方法,更直观, 就是把它画出来。

(记得高中时画的坐标轴吗? 直观。。现在我们用电脑画,呼 可不是PS)

 

工作了整一天,先直接看看程序的效果图哈:

 

 

 

 

 用的是ruby, wxruby. 附件中有源码和exe文件可供下载(别扔鸡蛋,纯爱好)

 

现在谁快谁慢, 图中一目了然了。

 

要往软件中新添加一个函数也很容易, 只要写一个类,放在charts目录下即可。

 

像这样:

 

module Charts
  class Log
    def name
      'log(n)'
    end
    
    def fun(x)
      x > 0 ? Math.log(x) : nil
    end
  end
end

 

 

现在我来看看,那个递归式T(n) = 2 T(n/2) + n 是否真的接近于 nlog(n), 我把n设置得大一点, 这样让递归式的曲线更平滑。因为我的实现是只计算整数的。

 

 

 

 

和nlog(n)最接近, 就是它啦!

 

第五章:概率分析和随机算法

 

这一章内容很少, 毕竟大部分相关的东西可以在专门的概率论数学书中有。

 

主要是分析了几个例子,重在分析的思路。

 

不过有两个“打乱数组元素”的算法,需要写一下。 我是用ruby完成的。

 

第一个比较简单,当然也比较傻瓜, 时间复杂度更高些(要排序,所以复杂度和排序相当 nlog(n))

 

差不多像这样:

 

 

def shuffle(array)
  array.sort_by { rand }
end

 

 第二个差不多是这样:

 

def shuffle(array)
  n = array.size
  n.times { |i|
    j = rand(n)
    array[i], array[j] = array[j], array[i]
  }
end

 

   在O(n)时间内完成

 

 

这一章还分析了两个趣味题:生日悖论,还有在线雇用

 

 其实同年同月同日生没这么难,只是和你同年同月同日生概率低一些 ,一堆人之中找出两个同样生日的,概率还是很高滴!

 

在线雇用这个问题本来不趣味,只是前段时间看到这个帖子

 

 http://www.iteye.com/topic/534346

 

第一题像是:苏格拉底的麦田问题。

 

怎么样才能尽可能的摘到最大的麦穗呢? 只许前进, 只有一次机会~~

 

 是个哲学问题,也是个数学问题。

 

有个想法: 前面先看几颗钻石,心中有个底,然后见到比前面最大的还要大的就选。

 

best = -1 # 钻石等级

# 先观察k颗,  以获取经验
k.times { |i|
    if level(i) > best # 碰到更好的,记录它
     best = level(i)
}

k.upto(n - 1) { |i|
   if level(i) > best
     return i   # 选的就是它
}

 

那 k 到底是多少,才能让我们拿到最大棵钻石的概率最大呢?

 

书中详细的分析,可知道当 k = n / e 时, 概率最大化为 1 / e,  (e大概是2.72)

 

也就是说: 十颗钻石,我们要先看4颗, 然后看到一颗比前面多大的,就拿吧, 这时候你拿到最大颗钻石的希望是:35% (还是很低? 比十分之一高多了)

 

 不过这在现实中不这么有用, 现实中我们有太多的先验知识,让我们知道什么样的麦穗是大的。什么样的钻石是好的。

 

所以麦田问题在现实中又上升到哲学层次,是知足常乐呢, 还是要就要最好的, 这就要看每个人自己啦)

 

 

  • 大小: 20.5 KB
  • 大小: 8.3 KB
分享到:
评论
1 楼 bingjing12345 2012-08-03  

也就是说: 十颗钻石,我们要先看4颗, 然后看到一颗比前面多大的,就拿吧
估计楼主也没自己算。。。。。
这是不对的。  应该先看3颗。
double sum3 = 0;
for(int i=3;i<10;i++){
sum3 +=1.0/i;
}
System.out.println((3.0/10 )*sum3) ;
double sum4 = 0;
for(int i=4;i<10;i++){
sum4 +=1.0/i;
}
System.out.println((4.0/10 )*sum4) ;
output:
0.39869047619047615
0.3982539682539683
你帖子浏览量这么高,最好负责点。。。。。

相关推荐

    算法导论读书笔记

    通过阅读和理解《算法导论》的这些章节,我们可以掌握基础的算法思想,提升问题解决能力,并为后续深入学习打下坚实基础。学习和实践这些算法,不仅可以提升编程技能,也有助于培养分析和解决复杂问题的能力。

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

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

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

    书中首先介绍了算法的基本概念、设计方法和分析技巧,包括时间复杂度和空间复杂度的计算,以及如何用大O符号表示算法效率。 2. **排序与搜索**:排序算法如冒泡排序、插入排序、选择排序、快速排序、归并排序和堆...

    麻省理工算法导论读书笔记

    《麻省理工算法导论读书笔记》是一份深入学习算法理论和实践的宝贵资源,源自世界顶级学府麻省理工学院的教学资料。这份笔记涵盖了算法分析、设计策略、数据结构等多个核心主题,对于想要深入了解算法的朋友们极具...

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

    《算法导论》是一本深度探讨计算机算法的权威著作,涵盖了算法设计、分析以及实现的各个方面。这份"算法导论授课教案学习笔记"是针对该书的深入学习资源,包括了教学教案、课后作业及解答,对于正在学习算法的学生来...

    MIT 算法导论 课堂笔记

    《MIT算法导论》是计算机科学领域的一部经典教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位教授合著。这本书深入浅出地介绍了算法的设计、分析以及实现,是许多大学计算机...

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

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

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

    《算法导论》深入探讨了算法的设计原则,包括递归、动态规划、贪心算法和分治策略,并提供了多种分析工具,如渐进分析、最坏情况和平均情况分析,帮助理解算法的时间复杂度和空间复杂度。 #### 数据结构的重要性 ...

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

    《算法导论》是计算机科学领域的一本经典之作,它深入浅出地介绍了算法的设计、分析和实现。在第四章中,我们主要探讨了“主定理”和“主方法”,这两个概念对于理解和解决复杂度为递归形式的算法至关重要。 主定理...

    算法导论的笔记与答案

    ### 算法导论的笔记与答案 #### 一、引言 《算法导论》是一本在计算机科学领域非常著名的教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein共同编写。这本书广泛地被用作大学本科...

    算法导论英文笔记和答案(较全)

    文档《算法导论英文笔记和答案(较全)》是由Thomas H. Cormen、Clara Lee和Erica Lin编写的,它是与《算法导论》(第二版)一书配套的辅助材料。本书的英文版由The MIT Press和McGraw-Hill Higher Education联合...

    《算法导论》学习笔记

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

    算法导论试题及答案

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

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

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

    MIT算法导论公开课之课程笔记 2.渐进符号、递归及解法.rar

    MIT的这门算法导论公开课深入浅出地探讨了算法的设计与分析,本笔记主要聚焦于渐进符号、递归以及问题的解决策略。以下是针对这些主题的详尽解析。 一、渐进符号 渐进符号是分析算法复杂度的重要工具,主要用于...

    算法导论教师手册

    根据提供的信息,我们可以总结出以下有关《算法导论教师手册》的重要知识点: ### 一、教材背景 《算法导论教师手册》是为配合《算法导论》(第二版)而编写的一本辅助教材,旨在帮助教师更好地理解和教授算法相关...

    [麻省理工学院-算法导论].Introduction.to.Algorithms.-.Lecture.Notes 算法导论-课堂笔记 讲义

    以上只是《算法导论》部分内容的概述,实际的课堂笔记和讲义会包含更丰富的例子、习题和解析,帮助读者深入理解和掌握这些概念。通过学习这些内容,可以提升对算法和数据结构的理解,为解决实际问题打下坚实基础。

    算法导论 课后解答 教师用书

    《算法导论》课后解答教师用书是针对Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest以及Clifford Stein所著的第二版《算法导论》的一部详尽的教学辅助资料。这本书由Thomas H. Cormen、Clara Lee和Erica...

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

    《算法导论》是计算机科学领域的一本经典著作,它深入浅出地介绍了各种重要的算法,为学习者提供了丰富的理论基础和实践经验。本篇读书笔记主要聚焦于第七章,我们将探讨其中的核心主题——快速排序。 快速排序是一...

    MIT(麻省理工)算法导论笔记

    《MIT(麻省理工)算法导论笔记》是一份详细记录了麻省理工学院(Introduction to Algorithms)课程精华的学习资料。这门课程是全球计算机科学专业学子深入理解算法的基石,其重要性不言而喻。尽管由于文件大小限制,...

Global site tag (gtag.js) - Google Analytics