摘要:加权图是一种为每条边关联一个权值或是成本的图模型。这种图能够自然地表示许多应用。在一幅航空图中,边表示航线,权值则可以表示距离或是费用。在这些情形中,最令人感兴趣的自然是将成本最小化。这里用加权无向图模型来解决最小生成树:给定一幅加权无向图,找到它的一棵最小生成树。 图的生成树是它的一棵含有其所有顶 阅读全文
posted @ 2020-12-03 07:53 Ruby_Lu 阅读(101) 评论(0) 推荐(0) 编辑
摘要:在有向图中,边是单向的:每条边连接的两个顶点都是一个有序对,它们的邻接性是单向的。许多应用都是天然的有向图,如下图。为实现添加这种单向性的限制很容易也很自然,看起来没什么坏处。但实际上这种组合性的结构对算法有深刻的影响,使得有向图和无向图的处理大有不同。 1.术语 虽然我们为有向图的定义和无向图几乎 阅读全文
posted @ 2020-11-22 08:50 Ruby_Lu 阅读(51) 评论(0) 推荐(0) 编辑
摘要:图是由一组顶点和一组能够将两个顶点相连的边组成。 顶点叫什么名字并不重要,但我们需要一个方法来指代这些顶点。一般使用 0 至 V-1 来表示一张含有 V 个顶点的图中的各个顶点。这样约定是为了方便使用数组的索引来编写能够高效访问各个顶点信息的代码。用一张符号表来为顶点的名字和 0 到 V-1 的整数 阅读全文
posted @ 2020-11-10 07:31 Ruby_Lu 阅读(65) 评论(0) 推荐(0) 编辑
摘要:如果所有的键都是小整数,我们可以使用一个数组来实现无序的符号表,将键作为数组的索引而数组中键 i 处存储的就是它对应的值。散列表就是用来处理这种情况,它是简易方法的扩展并能够处理更加复杂的类型的键。我们需要用算术操作将键转换为数组的索引来访问数组中的键值对。 使用散列表的查找算法分为两步。第一步是用 阅读全文
posted @ 2020-09-15 20:56 Ruby_Lu 阅读(124) 评论(0) 推荐(0) 编辑
摘要:之前讲的二叉查找树在最坏情况下性能还是很低的。平衡查找树能够保证无论如何构造它,它的运行时间都是对数级别。在一棵含有 N 个结点的树中,我们希望树高为 ~lgN,这样我们就能保证所有查找都能在 ~lgN 次比较内结束,就和二分查找一样。但是,在动态插入中保证树的完美平衡的代价太高。我们稍微降低完美平 阅读全文
posted @ 2020-09-06 09:15 Ruby_Lu 阅读(153) 评论(1) 推荐(0) 编辑
摘要:对于符号表,要支持高效的插入操作,就需要一种链式结构。但单链表无法使用二分查找,因为二分查找的高效来自于能够快速通过索引取得任何子数组的中间元素,链表只能遍历(详细描述)。为了将二分查找的效率和链表的灵活性结合,需要更复杂的数据结构:二叉查找树。具体来说,就是使用每个结点含有两个链接的二叉查找树来高 阅读全文
posted @ 2020-08-23 20:38 Ruby_Lu 阅读(101) 评论(0) 推荐(1) 编辑
摘要:高效检索海量信息(经典查找算法)是现代信息世界的基础设施。我们使用符号表描述一张抽象的表格,将信息(值)存储在其中,然后按照指定的键来搜索并获取这些信息。键和值的具体意义取决于不同的应用。符号表中可能会保存很多键和很多信息,因此实现一张高效的符号表是很重要的任务。 符号表有时被称为字典,有时被称为索 阅读全文
posted @ 2020-08-19 08:08 Ruby_Lu 阅读(166) 评论(0) 推荐(0) 编辑
摘要:排序就是将一组数据按照某种逻辑顺序重新排序的过程。排序算法的目的就是将所有元素的主键按照这种逻辑顺序排列。 先编写一个排序算法的基类,后面其他算法可以直接继承: public class BaseSort { public BaseSort() { } public static void Sort 阅读全文
posted @ 2020-07-30 07:59 Ruby_Lu 阅读(62) 评论(0) 推荐(0) 编辑
摘要:优先队列 许多应用程序都需要处理有序的元素,但不一定要求它们全部有序,或是不一定要一次就将它们排序。很多情况下是收集一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素。这种情况下,需要的数据结构支持两种操作:删除最大的元素和插入元素。这种数据结构类型叫优先队列。 这里, 阅读全文
posted @ 2020-07-29 07:50 Ruby_Lu 阅读(217) 评论(0) 推荐(0) 编辑
摘要:快速排序是应用最广泛的排序算法,流行的原因是它实现简单,适用于各种不同情况的输入数据且在一般情况下比其他排序都快得多。 快速排序是原地排序(只需要一个很小的辅助栈),将长度为 N 的数组排序所需的时间和 N lg N 成正比。 1.算法 快速排序也是一种分治的排序算法。它将一个数组分成两个子数组,将 阅读全文
posted @ 2020-07-25 09:23 Ruby_Lu 阅读(116) 评论(0) 推荐(0) 编辑