数据结构和算法
文章平均质量分 75
Paul_Joo
这个作者很懒,什么都没留下…
展开
-
蛮力法中的一些排序算法
排序算法除了要考虑时间,空间复杂度以外,还需要考虑到稳定性。稳定的排序算法表示在排序前后,相等的两个值的前后位置保持不变。选择排序首先从第一个元素开始扫描整个序列,并将序列的最小元素和第一个元素交换,然后从第二个元素开始扫描,将n-1个元素中的最小序列与第二个元素交换,执行到n-1个元素后,这个序列就排序好了。/** * 升序 * 遍历数组找出最小的与第一个交换,第二小的与原创 2014-07-29 21:30:40 · 1080 阅读 · 0 评论 -
编程珠玑-随机抽样
该算法按顺序考虑整数0,1,2,...,n-1,并通过合适的随机测试选择每个元素。通过按序访问整数,就能保证输出结果是有序的。下面通过m=2和n=5这个例子来理解选择条件。选择第一个整数0,概率为2/5,程序通过下面的语句来实现:Random random = new Random();int n = 100;//总的样本数int m = 50;//抽取的样本数int select转载 2015-04-09 16:05:19 · 297 阅读 · 0 评论 -
AVL树
AVL树使带有平衡条件的二叉查找树。一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树(空树的高度定为-1)。当进行插入操作时,我们需要更新通向根节点路径上那些节点的平衡信息,而插入操作的隐含着困难的原因在于,插入一个节点可能破坏AVL树的特性。如果发生这种情况,那么就要考虑这一步插入完成之前恢复平衡的性质。事实上,这总可以通过对树进行简单的修正来做到,我们称其为旋转。翻译 2014-12-31 11:17:04 · 312 阅读 · 0 评论 -
散列
散列是一种用于以常数平均时间执行插入、删除和查找的技术。但是,那些需要元素间任何排序信息的树操作将不会得到有效的支持。因此,诸如findMin、findMax以及以线性时间将排过序的整个表进行打印的操作都是散列所不支持的。每个关键字被映射到从0到TableSize - 1这个范围中的某个数,并且被放到适当的单元中。这个映射就叫做散列函数。因为单元的数目是有限的,而关键字实际上是用不完的。因此,翻译 2014-12-31 13:51:16 · 393 阅读 · 0 评论 -
B树
如果数据装不下内存,那么就意味着要把数据结构放到磁盘上。此时磁盘的访问代价太高了,我们想要把磁盘访问次数减小到一个非常小的常数。我们可以以与建立二叉查找树大致相同的方式建立M叉查找树。阶位M的B树是一棵具有下列特性的树:1.数据项存储在树叶上。2.非叶节点存储直到M - 1个关键字以指示搜索的方向;关键字i代表子树i + 1中的最小的关键字。3.树的根或者是一片树叶,或者其儿子翻译 2014-12-31 12:24:38 · 340 阅读 · 0 评论 -
二叉查找树
使二叉树成为二叉查找树的性质是,对于树中的每个节点x,它的左子树中所有项值小于x中的项,而它的右子树中所有项的值大于x中的项。二叉查找树中的删除如果节点是一片树叶,那么它可以被立即删除。如果节点有一个儿子,则该节点可以在其父节点调整自己的链以绕过该节点后被删除。复杂的情况是处理具有两个儿子的节点。一般的删除策略是用其右子树的最小的数据代替该节点的数据并递归地删除那个节点。因为右子树中的翻译 2014-12-31 10:56:02 · 289 阅读 · 0 评论 -
伸展树
伸展树保证从空树开始连续M次对树的操作最多花费O(M log N)时间。一棵伸展树每次操作的摊还代价是O(log N)。 伸展树的基本 想法是,当一个节点被访问后,它就要经过一些列AVL树的旋转被推到根上。因为在许多应用中当一个节点被访问时,它很可能不久再被访问。翻译 2014-12-31 12:18:27 · 206 阅读 · 0 评论 -
栈
栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶。栈又叫做LIFO(后进先出表),由于栈是一个表,因此任何实现表的方法都能实现栈。栈的链表实现栈的第一种实现方法是使用单链表。通过在表的顶端插入来实现push,通过删除表顶端元素实现pop。top操作只是考察表顶端元素并返回它的值。栈的数组实现与每个栈相关联的操作是theArray和topOfStack,对翻译 2014-12-30 16:03:52 · 211 阅读 · 0 评论 -
队列
队列也是表,使用队列时插入在一端进行而删除在另一端进行。队列的数组实现对于每一个队列数据结构,我们保留一个数组theArray以及位置front和back,它们代表队列的两端。我们还要记录实际存在于队列中的元素的个数currentSize。为使一个元素x入队(即执行enqueue),我们让currentSize和back增1,然后置theArray[back] = x。若使元素dequ翻译 2014-12-30 16:35:52 · 232 阅读 · 0 评论 -
MyLinkedList
MyLinkedList类,包含两端的链、表的大小以及一些方法。Node类,一个节点包含数据以及到前一个节点的链和到下一个节点的链,还有一些适当的构造方法。LinkedListIterator类,该类抽象了位置的概念,并实现接口Iterator。它提供了方法next、hasNext和remove的实现使用额外的头节点和尾节点的优点在于,通过排除许多特殊情形极大地简化了编码。例如翻译 2014-12-24 17:52:26 · 352 阅读 · 0 评论 -
MyArrayList
MyArrayList将保持基础数组,数组的容量,以及存储在MyArrayList中的当前项数。MyArrayList将提供一种机制以改变基础数组的容量。通过获得一个新数组,将老数组拷贝到新数组中来改变数组的容量,允许虚拟机回收老数组。MyArrayList将提供get和set的实现。MyArrayList将提供基本的例程,如size、isEmpty和clear。还提供remove,以翻译 2014-12-24 09:34:04 · 1388 阅读 · 1 评论 -
优先队列(堆)
优先队列在多用户环境中,操作系统调度程序必须决定在若干进程中运行哪个进程。一般说来,短的作业要尽可能快地结束,这一点很重要,因此在已经运行的作业当中这些短作业应该拥有优先权。此外,有些作业虽不短小但很重要,也应该拥有优先权。 这种特殊的应用似乎需要一类特殊的队列,我们称之为优先队列。 优先队列至少允许下列两种操作, 1. 插入 2. 删除最小者:找出、返回并删除优先队列中最小的元素。二叉堆二翻译 2015-07-31 16:46:07 · 350 阅读 · 0 评论