Data Structure
tuke_tuke
这个作者很懒,什么都没留下…
展开
-
数组线性表ArrayList的内部实现
线性表是按顺序存储数据是常用的一种数据结构。大多数线性表的典型操作是:1,初始化线性表2,判断表是否为空3,求线性表的长度4,读取线性表中的第i个元素5,查找满足条件的数据元素6,在线性表的第i个位置之前插入一个新的数据元素7,删除线性表中的第i个数据元素8,表置空9,查找第i个元素的前驱或后继10,按一个或多个数据项递增或递减重新排列数据元素数组线性表原创 2015-09-05 11:19:14 · 1075 阅读 · 0 评论 -
数据结构之排序算法(四)-归并排序
归并算法排序的思想:把原始数组分成若干子数组,对每一个子数组进行排序,继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组。总结一句话就是:将数组不断的分成两半,直到每个子数组只包含一个元素,然后将这些小的子数组归并为稍大的有序子数组,直到最后形成一个有序的数组。算法图解是:MergeSort.javapublic class MergeSort {//原创 2015-12-25 15:38:13 · 1613 阅读 · 1 评论 -
数据结构之排序算法(五)-直接插入排序,希尔排序,直接选择排序
直接插入排序:时间复杂度:O(n^2)基本算法思路是:把后面待排序的记录按其关键字的大小逐个插入到一个已经排好序的有序序列中,直到所有记录插完为止,得到一个新的有序序列。(无序插入前面有序)算法步骤:对数组a1,设置监视哨a[i],将待插结果的值赋值给temp2, 设置开始查找的位置j=i-1;3,在数组j后面搜索,如果temp将第j个记录后移,直到temp>=a[j]4,原创 2016-04-06 11:24:42 · 4811 阅读 · 2 评论 -
Java集合中的排序API分析
1,Arrays类中的静态排序APIArrays.sort(int[] a)中的排序是用的是快速排序,时间复杂度是O(nlogn)Arrays.sort(T[],Comparator c)使用的是归并排序,归并排序是稳定的,当c=null时按自然序排列2,Collections静态排序API,Collections的排序都是稳定的Collections.sort原创 2016-04-08 22:20:21 · 6707 阅读 · 1 评论 -
8个排序算法的稳定性总结
有时候做题,选择题,编程题,设计到排序的,都会要求说什么,相等元素,他们的额相对位置不变,开始还一头雾水,看讨论才知道这是排序的稳定性问题。先总结一下知识先,喝点汤补补稳定性:用一句话说就是数组中相等元素,排序后的与排序前的相对位置不变,就是排序前在前面,排序后还是在前面举个栗子:序列5 85 2 9, 我们知道第一遍选择第1个元素5会和2交换,排序后2 8 5 5 9那么原原创 2016-04-08 21:25:48 · 1369 阅读 · 2 评论 -
用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue
一,用结点实现链表LinkedList,不用换JavaAPI的集合框架import java.util.Scanner;public class Main { public static class Node { int data; Node next=null; public Node(int data){this.data=data;};原创 2016-05-06 14:03:53 · 1188 阅读 · 0 评论 -
基于快速排序思想的三个算法题
一,最小的k个数输入n个数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8,个数字,则最小的数字是1,2,3,4基于O(n)的算法,可以用基于Partion函数解决这个问题,如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数组大的所有数字都位于数组的右边,这样调整之后数组左边的k个数字就是最小的k个数字,不一定有序import jav原创 2016-05-22 20:30:20 · 5081 阅读 · 0 评论 -
动态规划思想
原文:http://blog.csdn.net/u013445530/article/details/45645307#什么是动态规划 ?动态规划( D ynamic P rogramming ,所以我们简称动态规划为 DP )是 运筹学 的一个分支,是求解决策过程(decision process) 最优化的数学方法。 20 世纪 50 年代初 美国 数学家R.E.Bellman 等人在原创 2016-07-04 19:04:03 · 1746 阅读 · 0 评论 -
动态规划-背包问题
问题描述:现有n件物品和一个容量为c的背包。第i件物品的重量是重量为w[i],价值是v[i]。已知对于一件物品必须选择取(用1表示)或者不取(用0表示),且每件物品只能被取一次(这就是“0-1”的含义)。求放置哪些物品进背包,可使这些物品的重量总和不超过背包容量,且价值总和最大。求解思路:假设有5件物品,其重量分别是w={2,2,6,5,4},价值分别是v={6,3,5,4,6},原创 2016-07-04 19:20:03 · 776 阅读 · 0 评论 -
动态规划--最长公共子串
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。其实这又是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab") b a bc 0 0 0a 0 1 0b 1 0 1a 0 1原创 2016-07-19 20:42:07 · 2043 阅读 · 0 评论 -
动态规划--最长公共子序列
1、填值,递增填·长度分别为m=len1+1和n=len2+1;·创建1个二维数组L[m.n];·初始化L数组内容为0· i和j分别从1开始,i++,j++循环:- 如果str1[i] == str2[j],则L[i,j] = L[i - 1, j -1] + 1;- 如果str1[i] != str2[j],则L[i,j] = max{L[i,j - 1],L[i - 1原创 2016-07-19 22:10:47 · 1055 阅读 · 0 评论 -
数据结构值排序算法(三)-快速排序
基本思想:快速排序采用的思想是分治思想。第一趟排序:快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归排序:第二步就是对高段位和地段为两部分进行递归排序。一趟快速排序的算法的步骤是:1)设置两个变量low、high,排原创 2015-12-23 11:17:37 · 8212 阅读 · 1 评论 -
数据结构之排序算法(二)-冒泡排序及改进
冒泡排序算法需要遍历几次数组。每次遍历都要比较连续相邻的元素,如果某一对相邻元素是降序,则互换它们的值,否则,保持不变。由于较小的值像“气泡”一样逐渐浮想顶部,而较大的值沉向底部,所以叫冒泡排序。冒泡排序的图解是:总结一句话就是:连续比较相邻的元素,降序则呼唤。有n个数,共需要比较n-1趟,第i趟,需要比较n-i次。BubbleSort.javapublic class B原创 2015-12-21 15:10:06 · 4605 阅读 · 0 评论 -
LinkedList的双向迭代器listiterator
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.ListIterator;public class testArrayAndLinkedList { public static void main(String[] args) { // TOD原创 2015-12-10 20:59:46 · 4470 阅读 · 0 评论 -
java集合框架LinkedList类的方法理解
java提供的LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是 List接口链表的实现。基于链表实现的方式使得LinkedList在插入和删除时更优于ArrayList,而随机访问则比ArrayList逊色 些。原创 2015-12-10 20:56:09 · 2130 阅读 · 4 评论 -
链表用java实现简单单链表linkedlist
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。每个结点包括两个部分:1是存储数据元素的数据域data2是存储下一个结点地址的指针域p。相比于线性表的优点:插入和删除结点方便。(插入删除的图都不画了,办公软件不好用)这里是对单链表的理解,并用java的泛型实现,当然与java集合提供的API LinkedList还是有原创 2015-12-10 20:12:56 · 3847 阅读 · 1 评论 -
数据结构-冒泡排序
public class BubbleSort {//时间复杂度O(n^2) //冒泡排序 public static void bubbleSort(int[] list){ int n=list.length; for(int i=1;i<n;i++){//总共比较n-1趟 for(int j=0;j<n-i;j++){//第i趟比较n-i次 if(list[j]>l原创 2015-12-13 11:27:40 · 639 阅读 · 0 评论 -
数据结构-栈
栈只允许访问一个数据项:即最后插入的数据。移除这个数据项后才能访问倒数第二个插入的数据项。它是一种“后进先出”的数据结构。栈最基本的操作是出栈(Pop)、入栈(Push),还有其他扩展操作,如查看栈顶元素,判断栈是否为空、是否已满,读取栈的大小等实现栈的方法有两种:1,栈的ArrayList实现,底层是数组import java.util.ArrayLi原创 2015-12-15 11:23:44 · 802 阅读 · 0 评论 -
数据结构-队列
栈是“后进先出”(LIFO,Last InFirst Out)的数据结构,与之相反,队列是“先进先出”(FIFO,First InFirst Out)的数据结构。队列特性:下面我们使用数组作为底层容器来实现一个队列的操作封装,与栈不同的是,队列的数据项并不都是从数组的第一个下标开始,因为数据项在数组的下标越小代表其在队列中的排列越靠前,移除数据项只能从队头移除,然后队头指针后移。原创 2015-12-17 16:34:54 · 1070 阅读 · 0 评论 -
数据结构-堆的实现
堆本质是一棵二叉树,其中所有的元素都可以按全序语义进行比较。用 堆来进行存储需要符合以下规则:1.元素可比较性:数据集中的元素可以进行比较,就是要实现Comparable接口;。2.节点最大/最小性:每个节点的元素必须大于或小于该节点的孩子节点的元素;3.堆是一棵完全二叉树。堆有两种:最大堆和最小堆。最小堆中每个节点的优先级小于或者等于它的子节点;最大堆则相反,每个节点原创 2015-12-19 14:13:39 · 9278 阅读 · 1 评论 -
数据结构-堆实现优先队列(java)
队列的特点是先进先出。通常都把队列比喻成排队买东西,大家都很守秩序,先排队的人就先买东西。但是优先队列有所不同,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出。这就很像堆的特征:总是移除优先级最高的根节点。重点:优先级队列,是要看优先级的,谁的优先级更高,谁就先得到权限。不分排队的顺序!上篇文章解释了堆的概念实现,现在用堆实现优先队列://最大原创 2015-12-19 15:56:20 · 5621 阅读 · 1 评论 -
数据结构-二叉树和二叉查找树
先按树-二叉树-二叉查找树的顺序解释会比较清楚。一,树树(Tree)是n(n≥0)个结点的有限集。在任意一棵非空树中:(1)有且仅有一个特定的被称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。结点的度(Degree):结点拥有的子树数称为结点的度(De原创 2015-12-20 17:44:30 · 6803 阅读 · 0 评论 -
数据结构之排序算法(一)-堆排序
继上篇文章讲到堆的实现之后http://blog.csdn.net/tuke_tuke/article/details/50357939,下面可以使用堆来实现堆排序。在堆的基础上实现堆排序的思路很简单:(这里使用最小堆,当然最大堆也可以) 最小堆MinHeap就是最小的数在堆的根元素的位置。首先把一组数建堆,然后再不断的移除堆的根元素,由于每次移除的根元素都是现有堆的最小元素,故可得到原创 2015-12-21 14:03:59 · 1653 阅读 · 0 评论 -
海量数据处理-Trie树
http://blog.csdn.net/beiyeqingteng/article/details/6981263http://blog.csdn.net/zmazon/article/details/8227610#关注Trie 这种结构已经很久,Trie有一个很有趣的用途,那就是自动提示。而且,前不久在一次面试里,也需要用Trie来解答。所以,在此对这个数据结构进行总结。转载 2016-09-23 11:00:44 · 1139 阅读 · 0 评论