随笔分类 -  数据结构与算法

1
摘要:广度优先搜索的应用场景,如下:(1)编写国际跳棋AI,计算最少走多少步就可获胜;(2)编写拼写检查器,计算最少编辑多个地方就可将错拼的单词改为正确的单词,如将READED改为READER需要编辑一个地方;(3)根据你的人际关系网络找到关系最近的医生; 图简介 假设你居住在旧金山,要从双子峰前往金门大 阅读全文
posted @ 2019-06-16 20:44 挑战者V 阅读(2707) 评论(0) 推荐(1) 编辑
摘要:散列函数 专业术语表述,”将输入映射到数字”。 散列函数具有如下要求:(1)它必须是一致的。如你输入blog得到的是wordpress,那么每次输入blog,得到的都必须为wordpress。 (2)它应将不同的输入映射到不同的数字。如,如果一个散列函数不管输入是什么都返回1,它就不是好的散列函数。 阅读全文
posted @ 2019-06-08 21:48 挑战者V 阅读(279) 评论(0) 推荐(0) 编辑
摘要:分而治之(又称D&C) 书中举了一个例子,假设你是农场主,有一块土地,如图所示: 你要将这块地均匀分成方块,且分出的方块要尽可能大。 从图上看,显然是不符合预期结果的。那么如何将一块地均匀分成方块,并确保分出的方块是最大的呢?使用D&C策略。 (1)D&C算法是递归的;(2)使用D&C解决问题的过程 阅读全文
posted @ 2019-05-31 22:47 挑战者V 阅读(5292) 评论(0) 推荐(0) 编辑
摘要:图一: 图二: 图一和图二对比,它们的作用都是相同的。从流程上分析,图一流程相对比较复杂,而图二则简单明了,这是某位同行在stackoverflow上面说过的话:如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易死理解。如何选择要看什么对你来说跟重要。 那么递归和循环之间的区别是什么呢? 阅读全文
posted @ 2019-05-26 17:56 挑战者V 阅读(1298) 评论(0) 推荐(0) 编辑
摘要:数组和链表 1.数组 以添加第四个待办事项为例,但后面的那个抽屉已经放了别人的东西 这就像你与朋友去看电影,找到地方就坐后又来了一位朋友,但原来坐的地方没有空位置,只得再找一个方可坐下所有人的地方。在这种情况下,你需要请求计算机重新分配一块可容纳4个待办事项的内存,再将所有待办事项移到那里。如果又来 阅读全文
posted @ 2019-05-18 21:06 挑战者V 阅读(408) 评论(0) 推荐(0) 编辑
摘要:假设你的计算机存储了很多乐趣。对于每个乐队,你都记录了其作品被播放的次数。 如果你要将这个列表按播放次数从多到少的顺序排列,从而将你喜欢的乐队排序。该如何做呢? 我第一眼看到这个问题时,想到的是通过sql解决这个问题假设如果这是一个数据表的话,我很容易就可以通过order by 字段名 desc进行 阅读全文
posted @ 2019-05-18 21:06 挑战者V 阅读(863) 评论(0) 推荐(0) 编辑
摘要:简单查找,如下图: 从图可知那个眼镜男从1开始猜,猜到100,大家都知道这种猜法最终都会得到答案,就是时间问题而已。100毕竟是这个列表的最大长度。但是换言之,如果是一万、百万、上千亿呢?那么这种猜法虽然能够得到答案,但是时间方面的成本将会非常大。于是二分法应需而生。二分法,如下图: 从图可知这次眼 阅读全文
posted @ 2019-05-18 21:06 挑战者V 阅读(504) 评论(0) 推荐(0) 编辑
摘要:其中fe0ffeeb是一个内存单元的地址,需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式,一种是数组,另外一种是链表。但它们并非都适用于所有情形,因此知道它们的差别非常重要。 阅读全文
posted @ 2019-05-18 21:06 挑战者V 阅读(328) 评论(0) 推荐(0) 编辑
摘要:大O表示法 大O表示法是一种特殊的表示法,指出了算法的速度有多快。 1.算法的运行时间以不同的速度增加 关于算法的运行时间以不同的速度增加,我联系到平时写代码,严谨的代码(易读,可扩展,精悍,经过多方测试等),通常运行速度与那些不严谨的代码(完全相反)的代码进行对比,你会发现前者的运行速度是大于后者 阅读全文
posted @ 2019-05-18 21:06 挑战者V 阅读(1218) 评论(0) 推荐(0) 编辑
摘要:感悟: 有句话叫做,一千个人里面就有一千个哈姆莱特,通常表示着不同的人对某个事物看法不同。 今天再读这篇文章时,联想到2018年的程序员跳楼事件。至于为什么跳楼,真相究竟是什么,这里不作探究。这里想说的是,放眼整个世界,每天都有像老黄牛这样的例子。老黄牛的例子让我战战兢兢如履薄冰,丝毫不敢松懈自己。 阅读全文
posted @ 2019-05-18 21:05 挑战者V 阅读(669) 评论(0) 推荐(0) 编辑
摘要:分析算法最混乱的方面大概集中在对数上面。我们已经看到,某些分治算法将以O(N log N)时间运行。此外,对数最常出现的规律可概括为下列一般法则: 如果一个算法用常数时间(O(1))将问题的大小削减为其一部分(通常是1/2),那么该算法就是O(logN)。另一方面,如果使用常数时间只是把问题减少一个 阅读全文
posted @ 2019-01-12 16:09 挑战者V 阅读(450) 评论(0) 推荐(0) 编辑
摘要:现在我们将要叙述四个算法来求解早先提出的最大子序列和问题。 第一个算法,它只是穷举式地尝试所有的可能。for循环中的循环变量反映了Java中数组从0开始而不是从1开始这样一个事实。还有,本算法并不计算实际的子序列;实际的计算还要添加一些额外的代码。 public static int maxSubS 阅读全文
posted @ 2019-01-10 21:56 挑战者V 阅读(388) 评论(0) 推荐(0) 编辑
摘要:有几种方法估计一个程序的运行时间。前面的表是凭经验得到的(可以参考:<数据结构与算法分析>读书笔记--要分析的问题) 如果认为两个程序花费大致相同的时间,要确定哪个程序更快的最好方法很可能将它们编码并运行。 一般地,存在几种算法思想,而我们总愿意尽早除去那些不好的算法思想,因此,通常需要分析算法。不 阅读全文
posted @ 2019-01-09 20:42 挑战者V 阅读(600) 评论(0) 推荐(0) 编辑
摘要:通常,要分析的最重要的资源就是运行时间。有几个因素影响着程序的运行时间。有些因素(如使用编译器和计算机)显然超出了任何理论模型的范畴,因此,虽然它们是重要的,但是我们在这里还是不能考虑它们。剩下的主要因素是所使用的算法以及对该算法的输入。 典型的情形是,输入的大小是主要的考虑方面。我们定义两个函数T 阅读全文
posted @ 2019-01-08 20:44 挑战者V 阅读(652) 评论(0) 推荐(0) 编辑
摘要:为了在正式的构架中分析算法,我们需要一个计算模型。我们的模型基本上是一台标准的计算机,在机器中指令被顺序地执行。该模型有一个标准的简单指令系统,如加法、乘法、比较和赋值等。但不同于实际计算机情况的是,模型机做任一简单的工作都恰好花费一个时间单位。为了合理起见,我们将假设模型像一台现代计算机那样固定大 阅读全文
posted @ 2019-01-07 22:20 挑战者V 阅读(324) 评论(0) 推荐(0) 编辑
摘要:数学知识复习是《数据结构与算法分析》的第一章引论的第二小节,之所以放在后面,是因为我对数学确实有些恐惧感。不过再怎么恐惧也是要面对的。 一、指数 基本公式: 二、对数 在计算机科学中除非有特别的声明,否则所有的对数都是以2为底的。 定义:XA=B 当且仅当logxB=A。 由该定义可以推出几个方便的 阅读全文
posted @ 2018-12-28 21:00 挑战者V 阅读(663) 评论(0) 推荐(0) 编辑
摘要:关于函数对象,百度百科对它是这样定义的: 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象。又称仿函数。 听起来确实很难懂,通过搜索我找到一篇博客,作者对其是这样的描述: 如果把对象理解成指针的话,也就是说,函数对象其实就是函数指针的概念。 阅读全文
posted @ 2018-12-27 21:36 挑战者V 阅读(354) 评论(0) 推荐(0) 编辑
摘要:一、简单的泛型类和接口 当指定一个泛型类时,类的声明则包括一个或多个类型参数,这些参数被放入在类名后面的一对尖括号内。 示例一: package cn.generic.example; public class GenericMemoryCell <AnyType>{ public AnyType 阅读全文
posted @ 2018-12-26 21:18 挑战者V 阅读(382) 评论(0) 推荐(0) 编辑
摘要:面向对象的一个重要目标是对代码重用的支持。支持这个目标的一个重要的机制就是泛型机制:如果除去对象的基本类型外,实现的方法是相同的,那么我们就可以用泛型实现来描述这种基本的功能。 1.使用Object表示泛型 Java中的基本思想就是可以通过使用像Object这样超类来实现泛型类。 示例一: (1)编 阅读全文
posted @ 2018-12-25 21:41 挑战者V 阅读(430) 评论(0) 推荐(0) 编辑
摘要:一、什么是递归 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要 阅读全文
posted @ 2018-12-24 22:03 挑战者V 阅读(274) 评论(0) 推荐(0) 编辑

1