数据结构
文章平均质量分 85
jiutianhe
这个作者很懒,什么都没留下…
展开
-
2.排序--插入排序和希尔排序
C语言版本:#includevoid insertSort(int a[],int n){ for(int i=0;i<n;i++) { int temp=a[i]; int j=0; for(j=i;j>0&&a[j-1]>temp;j--) { a[j]=a[j原创 2012-09-14 13:14:16 · 501 阅读 · 0 评论 -
二叉树
1求二叉树中相距最远的两个节点之间的距离2判断二叉树是否平衡二叉树3指定二叉树,给定两节点求其最近共同父节点4二叉树的广度遍历、逐层打印二叉树节点数据、只打印某层节点数据5在二叉树中找出和(叶子到根节点路径上的所有节点的数据和)为指定值的所有路径。6将二叉查找树转为有序的双链表7求二叉树的镜像8二叉树前序、中序、后序遍历的非递归实现9转载 2012-10-31 15:46:41 · 884 阅读 · 0 评论 -
Java栈的实现(顺序栈、链式栈)及栈的应用
1. 顺序栈的实现package lang;import java.io.Serializable;import java.util.Arrays;/** * @ClassName: ArrayStack * @Description: 顺序栈 * @date 2014年1月20日 上午8:47:19 * @param */public clas原创 2014-01-21 15:40:35 · 9884 阅读 · 3 评论 -
最长连续回文串(Longest Palindromic Substring)
给出一个字符串S,找到一个最长的连续回文串。例如串 babcbabcbaccba 最长回文是:abcbabcba算法首先将输入字符串S, 转换成一个特殊字符串T,转换的原则就是将S的开头结尾以及每两个相邻的字符之间加入一个特殊的字符,例如#例如: S = “abaaba”, T = “#a#b#a#a#b#a#”.为了找到最长的回文字串,例如我们当前原创 2014-02-18 15:27:01 · 1052 阅读 · 0 评论 -
java中HashSet、LinkedHashSet、TreeSet、ArrayList、ArrayDeque、LinkedList使用区别
HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放;LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代; TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。ArrayList 顺序表存储,访问快,插入和删除慢。ArrayDeque原创 2014-04-03 16:39:15 · 5597 阅读 · 1 评论 -
计数排序
计数排序是建立在这样的前提条件下的:假设n个输入元素的每一个都是0到k区间内的一个整数,其中k为某个整数。因此我们后面所写的程序也只是针对0到k之间的元素进行排序,换句话说,排序元素中不能有负数。 计数排序的基本思想是:对一个输入元素x,先确定所有输入元素中小于x的元素个数,那么排序后x所在的位置也就明确了。比如,所有的输入元素中有10个元素小于x,那么排好序后x的位置序号就应该是1转载 2014-06-05 14:51:22 · 764 阅读 · 0 评论 -
基数排序
基数排序的排序时间也可以达到线性,尤其在k和d(后面介绍该参数)很小的情况下。 基数排序采取的是多关键字比较的策略,且每个关键字对排序的影响不同,根据关键字影响的主次,有两种排序方法: 1、先根据影响最大的关键字来排序,而后在该关键字相同的情况下,再根据影响次之的关键字来排序,依此类推,直到最后按照影响最小的关键字排序后,序列有序。我们称这个为先高位后低位。转载 2014-06-05 14:54:01 · 700 阅读 · 0 评论 -
筛法求素数
筛法其实就是以空间换时间的一个最好的证明。空间复杂度增加了,时间复杂度降低了。这个斐波那契数列求解类似,如果用递归,那么时间复杂度很慢,如果将用数组存储一个斐波那契数列,则时间复杂度降低到线性。原创 2014-05-30 15:04:50 · 919 阅读 · 0 评论 -
最短路径的Floyd与Dijkstra算法
Floyd算法和Dijkstar算法是用来获得图中两点最短路径的算法。Dijkstar算法最终能够得到一个节点到其他所有节点的最短路径,而Floyd算法最终能够找出每对点之间的最短距离。Dijkstar算法算法简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dij原创 2012-11-13 12:17:56 · 9947 阅读 · 1 评论 -
4.排序--归并排序的实现
1. 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。复制去Google翻译翻译结果原创 2014-09-28 14:19:34 · 679 阅读 · 0 评论 -
当今世界十大经典算法
当今世界,已经被发现或创造的经典算法数不胜数。如果,一定要投票选出你最看重的十大算法,你会作何选择列?有国外网友在StackExchange上发起过投票,让人们投票选出心目中最为经典的算法,最终产生了下面得票数最高的十大经典算法(投票数统计截止到2011年3月7日):第十名:Huffman coding(霍夫曼编码) 霍夫曼编码(Huffman Coding)是一种编码方式,是一转载 2014-10-15 11:42:05 · 1292 阅读 · 0 评论 -
程序员必知的10大基础实用算法
算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conq转载 2014-10-15 10:53:18 · 923 阅读 · 0 评论 -
按单词反转字符串
题目要求:把字符串“I am a student”反转成为“student a am I”,不借助任何库函数。 字符串中单词顺序反转的方法有很多种,我们可以定义一个栈结构,根据栈的特性,先进后出。我们通过依次查找空格(在实际分析单词应用中这只是最简单的情况,单词之间可能直接用标点符号区分,但是使用标点符号并不意味着就是两个单词,西方世界计数方式喜欢使用三位数字加一个逗号形式比如“3转载 2014-10-31 16:48:57 · 973 阅读 · 0 评论 -
面试题:赛马问题
据说,这是Google的面试题。面试题目如下:一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问,最少得比多少场才能知道跑得最快的5匹马?(不能使用撞大运的算法)很明显这是一个算法题,网上有很多贴子在讨论这个问题,不过都没有给出一个明确的答案。我想了想,想到下面的一个算法:1转载 2014-11-03 17:39:24 · 11377 阅读 · 2 评论 -
数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
BST树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: BST树的搜索,从根结点开始,如果查询的关键字与转载 2014-12-23 14:39:38 · 965 阅读 · 0 评论 -
Java程序员必须掌握的8大排序算法
本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文8种排序之间的关系:1, 直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。(2)实例(3)用java实现转载 2015-01-16 14:49:33 · 5796 阅读 · 1 评论 -
二叉树的遍历(Java实现)
主要是二叉树的遍历,包括递归遍历和非递归遍历package util;import java.util.ArrayDeque;import java.util.ArrayList;import java.util.List;import java.util.Queue;public class BinaryNode { /** * 泛型BinaryNode原创 2012-10-09 10:42:32 · 1891 阅读 · 0 评论 -
java队列实现(顺序队列、链式队列、循环队列)
1.顺序队列的实现package lang;import java.io.Serializable;import java.util.Arrays;/** * @ClassName: ArrayQueue * @Description: 顺序队列 * @date 2014年1月20日 下午3:46:19 * @param */public clas原创 2014-01-21 15:45:31 · 41242 阅读 · 3 评论 -
java list如何remove
在java中对list进行操作很频繁,特别是进行list启遍历,这些操作我们都会,也很熟悉,但是对java中list进行删除元素,remove list中的元素就不怎么熟悉了吧,可以说很陌生,是实际操作中也很容易出错,先看看下面这个java中如何remove list 中的元素吧.public class test { public static void main(String[] ar转载 2014-01-13 09:59:33 · 3094 阅读 · 0 评论 -
3.排序--快速排序
C语言版本:/*快速排序 2012.2.25*/#include int partion(int a[],int low,int high) //返回枢轴位置{ int i=low; int j=high; int pivot=a[low]; while(i<j) { while(i=pivot)原创 2012-09-13 17:12:17 · 538 阅读 · 0 评论 -
KMP字符串匹配
java版本:package util;public class KMPStringMatch { //KMP字符串匹配 private int[] getNext(String T){//T为模式串 int[] next=new int[T.length()]; int j=1;// int k=0;// next[0]=-1; next[1]=原创 2012-09-13 17:22:22 · 488 阅读 · 0 评论 -
在一个词典中找出所有的变位词
编程珠玑题:java实现package program.pearls;import java.io.*;import java.util.*;import java.util.Map.Entry;public class DictionaryAnagram { /** * 在一个词典中找出所有的变位词, * 例如 pots stop tops互为变位原创 2012-09-13 17:25:26 · 1232 阅读 · 0 评论 -
单链表是否有环和两个单链表是否相交
1、如何判断一个链表是不是有环? 2、如果链表为存在环,如何找到环的入口点?3、判断两个单链表是否相交,如果相交,给出相交的第一个点(两个链表都不存在环)。1、解答:判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,f原创 2012-10-04 11:04:27 · 511 阅读 · 0 评论 -
荷兰国旗问题--快速排序的变种
1.问题描述:我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。2.问题分析:这个问题我们可以将这个问题视为一个数组排序问题,这个数组分为前部,中部和后部三个部分,每一个元素(红白蓝分别对应0、1、2)必属于其中之一。由于红、白、蓝三色小球数量并不一定相同,所转载 2012-10-04 17:15:44 · 1097 阅读 · 0 评论 -
1.排序算法--选择排序和堆排序
一.选择排序JAVA代码://泛型选择排序 public static > void selecttionSort(T[] arr){ int smallIndex; int n=arr.length; T temp; for (int i = 0; i < n-1; i++) { smallIndex=i; for (int j = i原创 2012-09-18 21:03:45 · 682 阅读 · 0 评论 -
二分查找
C语言版:#includeint BinarySearch(int *arr,int left,int right,int elem){ int min=left,max=right,mid; while(min<max-1) { mid=min+(max-min)/2; if(arr[mid]<=elem)原创 2012-09-15 20:50:53 · 662 阅读 · 0 评论 -
哈夫曼树
哈夫曼树又称最优二叉树哈夫曼树的构造 哈夫曼树的构造 假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为: (1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点); (2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其原创 2012-10-09 10:55:38 · 932 阅读 · 0 评论 -
二叉排序树(二叉搜索树)
二叉排序树二叉排序树又称为二叉查找树,它是一种特殊结构的二叉树,其定义为:二叉树排序树或者是一棵空树,或者是具有如下性质的二叉树:(1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值;(2)若它的右子树非空,则右子树上所有结点的值均大于根结点的值;(3)它的左右子树也分别为二叉排序树。这是一个递归定义。由定义可以得出二叉排序树的一个重要性质:中序遍历一个二叉排序树时可原创 2012-10-09 11:17:50 · 4418 阅读 · 0 评论 -
传教士和野人问题(Missionaries and Cannibals)
传教士和野人问题(Missionaries and Cannibals) 这是一个经常在有关讨论人工智能的书籍中见到的问题, 其描述是这样的: 有N个传教士和N个野人来到河边渡河, 河岸有一条船, 每次至多可供k人乘渡。问传教士为了安全起见, 应如何规划摆渡方案, 使得任何时刻, 河两岸以及船上的野人数目总是原创 2012-10-14 18:38:30 · 15198 阅读 · 3 评论 -
喝汽水问题
喝汽水问题 有1000瓶汽水,喝完后每3个空瓶能换1瓶汽水,问最后最多可以喝几瓶汽水,此时剩余几个空瓶?不妨假设,共有n瓶汽水,每a个空瓶能换b瓶汽水(a > b)。刚开始有n瓶汽水,喝完后就有n个空瓶,多喝的汽水是靠空瓶换来的,每进行一次空瓶换汽水,就能多喝b瓶汽水、空瓶数目就减少了a-b个(a个空瓶换了b瓶汽水,喝完后得到b个空瓶)。(下面用 [x]表示x的整数部分)转载 2012-10-31 15:37:18 · 696 阅读 · 0 评论 -
0-1背包问题
问题描述:给定n种物品和一背包,物品i的重量是wi,其价值是pi,背包的容量是M,问如何选择装入背包中的物品总价值最大?可以这样理解:背包的背负有上限,因此在这个上限内尽可能多的装东西,并且价值越多越好。在这里我之想讨论动态规划解决这个问题的详细过程。问题的特点是:每种物品一件,可以选择放1或不放0。用子问题定义状原创 2012-11-05 11:17:24 · 925 阅读 · 0 评论 -
计算字符串的相似度
《编程之美》,参阅了其中的——计算字符串的相似度许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把“a”替换为“b”)。 2.增加一个字符(如把“abdd”变为“aebdd”)。 3.删除一个字符(如把“travelling”变为“tra原创 2012-10-26 19:08:14 · 721 阅读 · 0 评论 -
倒水问题
题目详情有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。我们还有一个足够大的水缸,足够容纳C升水。起初它是空的,我们只能往水缸里倒入水,而不能倒出。可以进行的操作是:把一个容器灌满;把一个容器清空(容器里剩余的水全部倒掉,或者倒入水缸);用一个容器的水倒入另外一个容器,直到倒出水的容器空或者倒入水的容器满。 问是否能够通过有原创 2013-12-01 21:45:44 · 868 阅读 · 0 评论 -
Trie树(字典树)
1. Trie树Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:原创 2012-10-16 13:56:13 · 26582 阅读 · 2 评论