- 博客(15)
- 收藏
- 关注
原创 算法技术--动态规划
本文介绍一种算法技术--动态规划。 一、什么是动态规划 动态规划与分治方法相似,通过组合子问题的解来求解问题。分治法会在计算时做许多不必要的工作(记不记得之前的一篇博客分析过没有优化过的斐波那契数列递归实现的时间复杂度高达指数级),然而动态规划则会把求过的子问题记录到一个容器中,从而避免了一些重复的工作。 我们常常使用动态规划来求解最优化问题,步骤如下: 1
2018-01-27 22:59:45 422
转载 Java情诗
If 我未曾 遇到你如同 故事类 还未加载到 虚拟机在 茫茫人海中 循环遍历直到邂逅 true的唯一If 我日渐 倾慕你嵌套循环 也包裹不住 思念满溢慌乱心跳 抛出的 异常信息会捕获到 心灵的秘密If 我沉迷 依恋你穷极 八种数据类型 也难言表心意
2018-01-27 19:53:37 526
原创 拉链法解决哈希冲突的方式和几种常见的散列函数
本文探讨拉链表解决哈希冲突的方式和几种常见的散列函数。 首先,什么是散列表? 对于一个数组,我们在O(1)时间复杂度完成可以完成其索引的查找,现在我们想要存储一个key value的键值对,我们可以根据key生成一个数组的索引,然后在索引存储这个key value键值对。我们把根据key生成索引这个函数叫做散列函数。显而易见,不同的key有可能产生相同的索引,这就叫做哈希碰撞,
2018-01-24 16:10:34 7823
原创 几种基本数据结构--栈、队列、双向链表、有根树的分析和简单实现
本文介绍几种基本数据结构--栈、队列、双向链表、有根树。一、栈 栈不用多说了,一种LIFO(后进先出)的数据结构,我们使用Java实现其入栈(PUSH),出栈(POP)的基本操作:public class Stack { public final static int DEFAULTSIZE = 10; private final E[] elements;
2018-01-23 17:17:46 1516
原创 桶排序--平均情况下时间代价为O(n)的排序算法
在介绍了计数排序和基数排序两种线性时间复杂度的排序算法之后,我们来介绍第三种时间复杂度为线性,平均情况下的时间代价为O(n)的的排序算法--桶排序。一、适用情况 这种排序假设输入数据服从均匀分布,而且需要已知待排序列的大概范围,是一种空间换时间的排序算法。二、基本思想 对于一个待排序列,我们已知它的大概范围的时候,我们把这个范围分为n个相同大小的子区
2018-01-21 00:53:10 7677
原创 Java中的数组互相赋值
本文探讨Java中数组中的赋值问题。在探讨这个问题之前必须先弄懂一件事,Java中的数组到底是什么东西?是类,是对象,还是什么其他奇奇怪怪的东西。答案是:Java中的数组本质上是对象。但是这个对象不是通过某个类实例化来的,而是JVM创建的,这也就不难解释对于一个数组对象arr,我们可以直接通过arr.length访问数组的长度。 现在我们知道了Java中数组本质上是对象,那么我们来看一下
2018-01-20 18:13:16 36189 2
原创 基数排序--基于计数排序的线性时间复杂度的排序算法
我们前面提到了一种时间复杂度为O(n+k),其中k是待排序列最大值的排序算法--计数排序,复习请点击此处。本文我们将继续介绍一种线性时间复杂度的排序算法--基数排序,这种排序算法的时间复杂度为Θ(d(n+k)),这种排序基于我们之前将的计数排序,其中n表示待排序列的规模,d表示待排序列的最大位数,k表示每一位数的范围,这也是一种时间换空间的算法。一、适用情况 我们看这个算法的
2018-01-20 17:28:07 19238 3
原创 计数排序--时间复杂度为线性的排序算法
我们知道基于比较的排序算法的最好的情况的时间复杂度是O(nlgn),然而存在一种神奇的排序算法,不是基于比较的,而是空间换时间,使得时间复杂度能够达到线性O(n+k),这种算法就是本文将要介绍的计数排序。一、适用情况 这个算法在n个输入元素中每一个都是0到k的范围的整数,其中k也是整数。当k = O(n)时,排序的时间复杂度为Θ(n)。它的性质也就决定了它的运用范围比较窄
2018-01-20 01:29:23 15219 1
原创 求数组的一个和最大的子数组
假设现在我们需要求数组的一个和最大的子数组,比如对于数组{-1,1,3,-1},和最大的子数组就是{1,3}。我们来设计一下这样的算法。一、暴力法 首先我们可能会想到使用暴力法两层循环来遍历数组求解,外层循环表示子数组的开始位置,内层循环表示子数组的结尾位置,一一遍历,最后得到最大的一个和以及子数组的开头和结尾,我们使用Java来实现: public static int[] ...
2018-01-19 01:03:49 585
原创 Java实现单向链表及其常见操作
本文将使用Java实现链表以及链表的常用操作。一、什么是链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成,而且由于没有闲置的内存,因此空间效率比数组高。其插入操作可达到O(1)复杂度,但是查找或者访问特定的结点复杂度是O(n)。二、单向链表的元素增加实现 ...
2018-01-15 15:49:10 10676
转载 面向对象的7大设计原则
法则1:优先使用(对象)组合,而非(类)继承[ Favor Composition Over Inheritance ]组合n (对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。n 将功能委托给所组合的一个对象,从而获得新功能。n 有些时候也称之为“聚合”(aggregation)或“包容”(containment),尽管有些作者对这些术语赋予了专门
2018-01-10 13:36:41 367
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人