最近开始看数据结构与算法分析,机械工业出版社的。今天刚开始看,刚看完第一章。
惊为天书,实在是太好了,按捺不住激动的心情。为何当初学习数据结构没有如此的激情呢?好了,插一个广告吧,对数据结构感兴趣的,推荐看下。看完这本保证你爱上数据结构,想想现在各个学校学生正在苦读的数据结构教材,也实在是让人痛心,国内啥时候能出几本好书啊。
刚出炉的读书笔记,大家捧捧场。开始正文。
先来两个题目,热热身。
设有一组N个数,要如何确定第k个最大者?
冒泡吧,这个是我的最初的想法,将结果放到数组里,然后找出第k-1个就可以了。这个是最基本的想法了。
稍微好点的,将前k个元素读入数组,并以递减排序,接着将剩下的数字,依次读入,小于第k个则直接忽略,大于就放到响应的位置。
这两个算法是书中给出的,我自己也想了一个其他的。首先可以统计总的数量为多少,如果总数量大于2k。可以取第一个数,以他为基准,对所有的数字进行比较,将大于等于和小于分成两组,并记录两组的数,如果在比较的过程中,大于该数字的数目已经超过k,则直接忽略小于该数字的数,也不用在保存,如果等于k-1则刚好是该数字,至到统计完。如果最后统计结果大于改数的数量大于k,则从大于的组中进行筛选。当然这个方法不是很好,对如何选数字有很强的依赖性和不稳定性。
那种算法好点呢?如果有大量数据,一百万个数字,k=500000,恐怕都很难快速的计算出结果,要若干天才能计算出来,但是在第7章,会给出一个算法,只要1秒就可以给出结果。
卖关子,真想一口气看到第7章。
第二个题目,解决一个流行的猜字谜的游戏。输入一个字母组成的二维数组,找出横,竖,以及斜线方向上的所有的正确的单词组合。
t h i s
w a t s
o a h g
f g d t
这个改如何解决,遍历所有的组合,然后遍历所有的正确的单词?这个方法太土了。而且如果词库是一本字典,那么计算就需要相当可观的时间。不过这样的问题还是有可能在数秒内解决,即使单词表很大。(伏笔)大家想想有啥好办法?
许多问题中,一个重要的观念是,写一个可以运行的程序不难。但是保证这个程序在大的数据集下运行,那么运行时间就成一个很大的问题。我们要学习的就是找到束缚程序速度的瓶颈,并找到合适的方法解决他。
好了这个问题就到这里。复习下数学。
1,常用数学公式。对公式证明感兴趣的同学可以在网上找相关资料。因为数学这些字符不知道怎么搞,只好来图片了。那位同学知道有写数学公式的好工具也介绍下。
2,模运算。如果A整除B-C,那么B与C模A同余。记作
3,证明方法。最常用的有归纳法和反证法。
归纳法有两个部分组成,第一,证明基准情形,就是确定定理对于某个小的值是正确的。第二,归纳假设,如果定理对于k的情况成立,那么对于k+1也应该成立。例子我这里不举了,如果不理解,可以参考高中归纳证明法的方法。
反证法,通过假设定理不成立,然后推导出某个已知的性质不成立。感觉这里有点错误吧。反证法只能证明定理的错误吧,因为只要假设定理正确,然后推导出一个不正确的性质,即可证明定理的错误。反之,恐怕不行吧。这个应该是充分条件和必要条件的差别。这里应该是书本的错误,不知道读过的有没有发现。
来个递归的例子。
我们有个数字,希望他能打印出来,但是我们有这样一个程序print_digit(4),打印4,每次只能打印单个数字。如何实现打印2124呢?
void print_out( unsigned int n ) /* print nonnegative n */
{
if( n<10 )
print_digit( n );
else
{
print_out( n/10 );
print_digit( n%10 );
}
}
不过并不是一个很好的主意,因为mod运算很消耗很大。N%10=N-[N/10]*10.
原来在学校时都是这么做的,看来完全没有可取性。
递归简论,递归的四大法则:
1,基准情形。必须有基准情形,就是所谓的已知条件。
2,不断推进。每次递归都在朝基准情形靠近。
3,设计法则,假设所有的递归调用都能运行。
一个反例
int bad( unsigned int n )
{
if(n == 0)
return 0
else
return( bad (n/3 + 1) + n - 1 );
}
4,合成效益法则。在求解同一问题的同一实例时,切勿在不同的递归调用中做重复的工作。(不懂,不过这个在后面章节会继续讲解)。
使用递归解决斐波那契数之类的简单数学函数的想法一般不是一个好主意。
总结:设计好的算法,需要学好数学和数据结构。
分享到:
相关推荐
《数据结构与算法分析C++描述(第三版)》是一本深入探讨数据结构和算法的专著,由Mark Allen Weiss撰写。这本书以C++编程语言为载体,详细阐述了数据组织方式和解决问题的有效方法,是计算机科学教育领域的重要教材...
标题“数据结构和算法分析电子版”所指向的知识点,首先是关于数据结构和算法分析这两个计算机科学的基础领域的探讨。数据结构主要涉及的是数据的组织、管理和存储方法,以便于更高效地访问和修改。它包括如数组、...
《Python数据结构与算法分析(第2版)》是一本专为对计算机科学和Python编程感兴趣的读者准备的书籍。本书旨在帮助读者理解数据结构、抽象数据类型和算法的重要性,同时提供Python语言的基础知识和实践应用。 在...
《数据结构与算法分析》是计算机科学领域的一本经典教材,由Larry Nyhoff撰写,主要讲解了如何使用C++语言来实现和理解各种数据结构和算法。这本书深入浅出地阐述了这些概念,并通过丰富的习题帮助读者巩固所学知识...
本书《数据结构和算法分析》由Mark Weiss著,旨在深入探讨这一领域,提供了丰富的习题以供读者练习和巩固知识。 在本压缩包中,包含的习题答案覆盖了第1至12章,较网上流传的9章更为全面。这意味着我们可以深入学习...
《数据结构与算法分析 C语言描述》是著名计算机科学家Mark Allen Weiss所著的一本经典教材,专注于探讨数据结构和算法的实现与分析。这本书对于学习和理解计算机科学的基础知识,尤其是对想要深入IT领域的程序员来说...
《数据结构与算法分析》是计算机科学领域的一本经典教材,尤其对于学习Java编程的开发者来说,这本书提供了深入理解数据结构和算法的宝贵资源。Java语言描述的第二版更是为Java程序员提供了针对性的学习材料。书中的...
《数据结构与算法分析》是计算机科学领域的一本经典教材,由Mark Allen Weiss著,这里提到的是C++语言描述的第二版。这本书深入探讨了如何有效地组织和操作数据,以及如何设计和分析算法,这对于任何想要在编程或...
学习《数据结构与算法分析:C语言描述》不仅能够提升编程技能,也是准备面试、进行软件开发或科研工作的重要基础。掌握这些知识,可以让你在面对复杂问题时更加游刃有余,编写出更高效、更可靠的代码。
《数据结构与算法分析》是一本在IT领域中极具影响力的著作,主要涵盖了计算机科学的核心主题——数据结构和算法分析。这本书深入浅出地讲解了如何有效地设计、实现和评估算法,以及如何选择合适的数据结构来优化问题...
《数据结构与算法分析》是计算机科学领域的一本经典教材,尤其对于学习Java编程的人员来说,这本书提供了深入理解数据结构和算法的宝贵资源。Java作为一种面向对象的编程语言,其强大之处在于能够高效地处理各种复杂...
数据结构与算法分析是计算机科学中的核心领域,对于任何想要深入理解编程原理或者从事软件开发工作的专业人士来说,都是必备的知识。本资源为“数据结构与算法分析(Java版英文)”的PDF文档,它以Java语言为载体,...
《数据结构与算法分析C++语言描述第四版参考答案》是针对Mark Allen Weiss所著的知名教材《Data Structures and Algorithm Analysis in C++》第四版的学习辅助资料,它提供了书中习题和编程练习的解答以及相应的源...
《数据结构与算法分析》是计算机科学领域的一本经典著作,由陈越教授撰写,主要讲解了数据结构和算法的设计、实现以及分析。这本书对于学习和理解计算机科学的基础至关重要,尤其是对于想要深入研究软件工程、计算机...
数据结构与算法是计算机科学的基础,它涉及到如何有效地组织和管理数据,以便进行高效地查找、存储和处理。本资源包含的数据结构与算法课后习题答案,是学习这一领域的重要辅助材料,可以帮助学生深入理解和巩固所学...
- **理论与实践结合**:书中不仅讲解了数据结构与算法的基本原理,还通过大量的实例帮助读者理解和掌握所学知识。 - **Python语言实现**:选择Python作为实现语言,这不仅是因为Python语法简洁易懂,也是因为它在...
《C++数据结构与算法(第4版)》是一本深度探讨C++编程语言中数据结构和算法的权威著作。本书旨在帮助读者深入理解如何在C++环境下有效地设计和实现数据结构以及解决复杂问题的算法。书中涵盖了从基础到高级的各种...
数据结构与算法分析是计算机科学中的核心课程,它关乎如何高效地存储和处理数据,以及设计和实现高效的算法。在C++版的《数据结构与算法分析》第三版中,第七章可能涵盖了诸如栈、队列、树、图、排序和查找等基本...