算法与数据结构
扎扎实实的系统的学习数据结构和算法,使用Java实现。
大唐雨夜
这个作者很懒,什么都没留下…
展开
-
时间复杂度和空间复杂度
时间复杂度1时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 2 时间复杂度在时间频度中,n称为问题的规原创 2017-03-12 11:14:56 · 408 阅读 · 0 评论 -
Java排序算法之堆排序
堆堆定义二叉树的每个节点都大于等于它的两个子节点(堆有序)–大顶堆。 - 小顶堆:每个节点小于等于其子节点。 - 根节点是堆有序的二叉树中最大(或最小)的节点。二叉堆表示下标i与 2i 和2i+1 是父与孩子的关系。 位置k的节点的父节点的位置为K/2,两个子节点的位置分别是 2k,2k+1。二叉堆:是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照原创 2017-03-13 18:13:32 · 357 阅读 · 0 评论 -
Java排序算法之快速排序
快速排序思想 按照a[lo] 的值v切分,指针i和j相遇时主循环退出; a[i]小于v时,i+1 a[j]大于v时,j-1 交换a[i], a[j] 保证 i 左侧均小于等于v,j右侧均大于等于等于v。 当指针相遇时交换a[lo], a[hi], 切分结束。切分值留在a[j] 中。 速度快,非稳定排序 时间复杂度是nlogn,空间复杂度lognJava实原创 2017-03-13 19:38:47 · 436 阅读 · 0 评论 -
Java排序算法之归并排序
归并排序的思想 基于分治的思想,将数组分为两个数组,分别排序,将有序的子数组归并到整个数组排序 适用于稳定性高,空间复杂度要求不苛刻的情况 时间复杂度O(nlog(n))Java实现import java.util.Arrays;public class Sort { public static void main(String[] args) { int[]原创 2017-03-13 20:27:43 · 474 阅读 · 0 评论 -
Java排序算法之希尔排序
算法思想 分组插入排序:将序列划分为子序列,分别进行直接插入排序,再缩减增量进行排序。 基于插入排序 算法时间复杂度nlogn,空间复杂度1 适用于大型数组Java实现import java.util.Arrays;public class Main { public static void main(String[] args) { int[] a原创 2017-03-14 19:07:48 · 392 阅读 · 0 评论 -
Java排序算法之插入排序
算法思想 每次从无序表中取出第一个元素,插入到有序表的合适位置 适合部分有序的数组或者小规模数组 时间复杂度n^2, 空间复杂度 1Java实现import java.util.Arrays;public class Main { public static void main(String[] args) { int[] a = { 2, 4, 3, 5,原创 2017-03-14 19:12:28 · 438 阅读 · 0 评论 -
Java排序算法之选择排序
算法思想 选出最小的,与第一个交换 冒泡排序是两两比较大的放后面。 时间复杂度n^2, 空间复杂度1Java实现import java.util.Arrays;public class Main { public static void main(String[] args) { int[] a = { 2, 4, 3, 5, 6, 3, 1 };原创 2017-03-14 19:17:20 · 388 阅读 · 0 评论 -
下压栈:动态数组实现
栈解释 // 栈是限制插入和删除只能在一个位置上进行的表; // 通过push向栈输入,通过pop和栈顶指针从栈输出; // 栈模型:只有栈顶元素是可访问的。Java实现package com.base;import java.util.EmptyStackException;import java.util.Iterator;/** * 下压栈:动态数组实现 * * @原创 2017-03-16 09:04:26 · 518 阅读 · 0 评论 -
下压栈:链表实现
下压栈链表实现,主要用到了单链表头部添加和头部删除两个内容。 根据栈的特性:后进先出。打印必须逆序打印JAVA实现import java.util.Iterator;/** * 下压堆栈 * * @author Administrator * * @param <Item> */public class Stack<Item> implements Iterable<Item> {原创 2017-03-16 09:27:53 · 503 阅读 · 0 评论 -
队列:链表实现
链表队列队列原则:先进先出 主要用到了单链表的头部删除和尾部添加两个内容Java实现import java.util.Iterator;public class Queue<Item> implements Iterable<Item> { private class Node { Item item; Node next; } private原创 2017-03-16 10:27:15 · 811 阅读 · 0 评论 -
队列:循环队列Java实现
循环队列原理Java实现public class CircleQueue<Item> { private static final int LENGTH = 4; private Item[] a = (Item[]) new Object[LENGTH]; private int N; private int first; // 头 private int原创 2017-03-16 11:08:12 · 1075 阅读 · 0 评论 -
链表:单链表反转超详解
解法一 思想: 每轮迭代,从原链表中提取结点srcFirst,并将它插入到逆链表的开头。 过程中一直保证 srcFirst是指向原链表中所有剩余结点的首结点, destFirst是指向结果链表的首结点 next是指向原链表中所有剩余结点的第二个结点。用于保存数据 代码实现public Node reverse(Node node){ Node src原创 2017-03-17 22:20:57 · 943 阅读 · 0 评论 -
链表:自定义双链表总结
双链表每个节点都有两个链prev和 next,所以相对于单链表在某些功能的实现上更简单一些。Java实现import java.util.Iterator;import java.util.NoSuchElementException;public class DoubleLinkedList<Item> implements Iterable<Item> { private class原创 2017-03-18 15:30:04 · 556 阅读 · 0 评论 -
链表:自定义单链表总结
单链表实现主要实现有: 1 获取首尾元素 2 是否包含某元素 3.1 尾部添加 3.2 头部添加 3.3 某节点后插入 3.4 某节点前插入 4.1 尾部删除 4.2 头部删除 4.3 某节点后删除 5 删除第k个元素 6 删除元素值为key的所有节点 7 链表反转(逆置) 8 获取k 位置上的节点 9 迭原创 2017-03-18 10:35:31 · 695 阅读 · 0 评论 -
查找:链表顺序查找和有序数组二分查找
符号表符号表是一种存储键值对的数据结构,支持两种操作:插入(put)和查找(get)。 可以分为无序符号表和有序符号表。本节的实现基于 每个键只对应着一个值,表不允许存在重复的键 向表中存入新的键值对和已有的键冲突时,新的值会替代旧的值 键不能为空null 值不能为空null无序链表中的顺序查找非常的低效 向一个空表插入N个不同的键需要N^2/2次比较。 只适用于小型原创 2017-03-17 11:07:29 · 2361 阅读 · 0 评论 -
查找:二叉查找树总结
二叉树查找树 一棵二叉查找树(BST)是一棵二叉树,其中每个节点都含有一个Comparable的键(以及相关的值),且每个节点的键都大于其左子树中的任意节点的键key,而小于右子树的任意节点的键key。节点 每个节点包含一个键、一个值、一个左链接、一个右链接、一个节点计数器N 每个节点包含结点数: size(x) = size(x.left) + size(x.right) +原创 2017-03-20 19:49:15 · 530 阅读 · 0 评论 -
平衡二叉树(AVL)代码笔记
一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树(空树的高度定义为-1)。 重点在于: 插入和删除可能破坏AVL树的平衡特性,需要进行平衡 分为四种情况: 假设重新平衡的节点为a 需要进行单旋转 (1)a的左儿子的左子树插入 (2)a的右儿子的右子树插入 需要进行双旋转 (3)a的左儿子的右子树插入 (4)a的右儿原创 2017-03-24 12:52:30 · 439 阅读 · 0 评论 -
散列表1: 基于分离链接法的散列表
散列表散列表的实现称为散列(hashing)。只支持二叉查找树的一部分操作,可以以常数平均时间执行插入、删除和查找,对元素间有着排序信息的树操作(如findMin、findMax等)不支持。原理散列表的查找算法分为两步: 1. 用散列函数将被查找的键转化为数组的一个索引。 2. 解决碰撞冲突的问题(多个键映射到数组的同一个索引的问题)解决碰撞的两种方法: 1. 分离链接法 2. 线性探测法散原创 2017-03-26 15:44:56 · 1365 阅读 · 0 评论 -
散列表2: 基于探测法的散列表
不用链表的散列表分离链接法的缺点使用了一些链表。给新单元分配地址需要时间,导致算法的速度会有些慢,同时算法还要求对第二种数据结构的实现。 而,不用链表解决冲突的方法是:尝试另外的单元,直到找到空的单元。装填因子散列表的装填因子(load factor) 为散列表中的元素个数对该表大小的比。 分离链接法的因子为1。 探测散列表:因子小于0.5探测散列表线性探测法线性探测法会存在一次聚集的问题平方原创 2017-03-26 16:42:18 · 1155 阅读 · 0 评论