Algorithms
Megustas_JJC
change the world by program
展开
-
动态连通性、并查集(union-find)算法介绍
本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。更多的信息可以参考Algorithms 一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧。原文中更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法。我觉得这个可能更加有意义一些,相比于记下一些结论。关于动态连通性假设我们输入了一组整数对原创 2016-09-08 21:34:54 · 1057 阅读 · 0 评论 -
动态规划之找零钱问题与背包问题
首先,个人对动态规划的理解就是一句话:找规律,找出状态转移方程,找出判决条件之后进行迭代找零钱问题用一个实际例子来体现动态规划的算法思想——硬币找零问题。 硬币找零问题描述:现存在一堆面值为 V1、V2、V3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为 T 个单位的零钱?假设这一堆面值分别为 1、2、5、21、25 元,需要找出总值 T 为 63 元的零钱。 很明显,只要拿出 3 个转载 2017-08-10 17:58:23 · 1389 阅读 · 0 评论 -
快速排序及优化算法(三向切分的快速排序)
快速排序应该是应用最广的排序算法了,快速排序引人入目的特点包括原地排序(只需要一个很小的辅助栈),并且将长度是N的数组排序所需的时间和NlgN成正比。另外,快速排序的内循环比大多数排序算法都要小很多,快排性能出色的一个原因就是不会像shell和merge排序一样在内循环进行元素的交换。 快速排序是一种分治的排序算法,将一个数组分成两个子数组,将两部分独立的进行排序。快排和归并是互补的:归并排序是将原创 2016-09-13 15:52:07 · 2659 阅读 · 0 评论 -
应用哈希对字符串问题进行高效处理
往往我们需要牺牲一定的空间为代码来优化时间性能,尽可能的缩短响应时间,也就是我们经常提到的“以空间换时间”。哈希表(散列表)是一种非常高效的查找数据结构,在原理上也与其他的查找不尽相同,它回避了关键字之间反复比较的繁琐,而是直接一步到位查找结果。当然,这也带来了记录之间没有任何关联的弊端。应该说,散列表对于那些查找性能要求高,记录之间关系无要求的数据有非常好的适用性。注意对散列函数的选择和处理冲突的原创 2017-04-09 19:02:27 · 564 阅读 · 2 评论 -
求两个数组的逆序数——Kendall tau距离
一组排列(或是排名)就是一组N个整数的数组,其中0到N-1的每个数都只出现一次。两个排列之间的Kendall tau距离就是在两组数列中顺序不同的数对的数目。例如a = { 0, 3, 1, 6, 2, 5, 4 } ,b = { 1, 0, 3, 6, 4, 2, 5 },Kendall tau就是4,因为就是求两个排列之间的逆序{ 0,1 },{ 3,1 },{ 2,4 },{ 5,4 },一共原创 2017-03-20 10:53:28 · 3557 阅读 · 0 评论 -
堆排序及优先级队列Java实现
优先队列之前的一篇关于《编程珠玑》的读书笔试介绍过优先队列与堆排序的一些内容(http://blog.csdn.net/megustas_jjc/article/details/52049845),近期进行算法的复习的时候,想到了对于之前堆排序的一些优化和想用Java对其进行一次实现,故写了这篇文章:/*优先队列:实现插入元素和删除最大元素的功能 */public class MaxPQ {原创 2017-03-19 19:46:55 · 1226 阅读 · 0 评论 -
二叉查找树
本文将会介绍一种能够将链表插入的灵活性和有序数组查找的高效性结合在一起的符号表实现。 定义 一颗二叉查找树(BST)是一颗二叉树,其中每个结点都含有一个Comparable的键(以及相关联的值)且每个结点的键都大于其左子树的任意结点的键而小于任意右结点的键。 其实现代码如下(采用泛型编写):public class BST<Key extends Comparable<Key>,Value>{原创 2016-09-24 20:43:44 · 358 阅读 · 0 评论 -
栈(Stack)、队列(Queue)与包(Bag)的实现
使用基本的链表结构实现栈,队列和包三种数据结构。首先用一个嵌套类来定义结点的抽象数据类型:private class Node{ Item item; Node next;}(1)堆栈Stackimport java.util.Iterator;public class Stack<Item> implements Iterable<Item>{ private Node原创 2016-09-03 21:59:51 · 2075 阅读 · 1 评论 -
Java动态调整数组大小
在Java中,数组一旦创建,其大小是无法改变的。因此,我们可以更改数组的实现,动态调整数组的大小,使得既能保存所有元素,又不至于浪费空间。实际上,完成这个很简单:private void resize(int max){ //将大小为N<MAX的栈移动到大小为MAX的数组中 Item[] temp = (Item[])new Object[max]; for(int i =原创 2016-09-21 10:43:39 · 11665 阅读 · 0 评论 -
选择排序、插入排序、希尔排序与归并排序
(1)选择排序public class Sortexample { public void exch(int[] a,int i,int j){ int temp = a[i]; a[i] = a[j]; a[j] = temp; } public void selection(int[] a){ int len原创 2016-09-10 21:01:05 · 443 阅读 · 0 评论