基础算法
林湾村龙猫
博客已简书(https://www.jianshu.com/u/5a327aab786a)为主
展开
-
算法时间复杂度计算
概述 一个算法是由控制结构(顺序,分支,循环)和原操作(指固有数据类型的操作)构成。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对所研究的问题来说是基本操作的原操作,以该基本原操作重复执行的次数作为算法的时间度量。多数情况下,基本原操作是它最深层循环中的原操作,对算法的时间度量最常用的是考虑在最坏的情况下时间复杂度。时间复杂度的定义 算法中基本操作重复执行的次数是问题规模n的原创 2015-04-29 18:17:53 · 1055 阅读 · 0 评论 -
红黑树-java实现
引言根据《算法》第4版。编写红黑树。理论参见:浅谈算法和数据结构: 八 平衡查找树之2-3树浅谈算法和数据结构: 九 平衡查找树之红黑树这些也是参考的《算法》特性红黑数事实上就是特殊的二叉排序树。 红黑树是一种具有红色和黑色链接的平衡查找树,同时满足: - 红色节点向左倾斜 - 一个节点不可能有两个红色链接 - 整个书完全黑色平衡,即从根节点到所以叶子结点的路径上,黑色链接的个原创 2016-08-15 11:56:06 · 336 阅读 · 0 评论 -
排序-java实现的选择/插入/希尔排序
引言用java实现的选择排序、插入排序、希尔排序。代码(java)package org.hirudy.practice;/** * @author: rudy * @date: 2016/08/10 * 选择排序,插入排序,希尔排序的java实现 */ public class SortPractice { /** * 获取调用函数的函数名称 * @return原创 2016-08-11 09:11:25 · 312 阅读 · 0 评论 -
字典树与三向字典树-java实现
引言用java实现的单词树与三向单词树。理论参考:单词查找树(Tries)Trie—单词查找树代码(java)package org.hirudy.practice;/** * @author: rudy * @date: 2016/08/15 * * 单词树,三向单词树 * */ public class TriePractice { /** * 单词树类原创 2016-08-15 18:01:12 · 803 阅读 · 0 评论 -
最大子序列和(4种方式)
一、问题描述 输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:序列:-2 11 -4 13 -5 -2,则最大子序列和为20。序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。二、PHP代码实现 /** * 找出最大子序列和 */// 方法一、 最暴力的方法 O(N^3)function find原创 2015-12-22 19:10:50 · 591 阅读 · 0 评论 -
选择排序
概述 选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换……第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。 选择排序是根据找到无序数列中的最大或最小值插入到有序序列尾部来排序理论http://blog.csdn.net/feixiaoxing原创 2015-05-18 15:45:55 · 612 阅读 · 0 评论 -
插入排序
概述 插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。 如果输入数组已经是排好序的话,插入排序出现最佳情况,其运行时间是输入规模的一个线性函数。如果输入数组是逆序排列的,将出现最坏情况。平均情况与原创 2015-05-18 15:23:16 · 770 阅读 · 0 评论 -
归并排序
概述 归并排序-顾名思义通过递归和合并的方式排序无序数列。归并排序是基于一种被称为“分治”(divide and conquer)的策略。 归并排序先分解无序数列到每一个无效数列为一个元素时候,该无序数列就是有序数列,然后一步步回退合并每一个有序数列理论http://blog.csdn.net/morewindows/article/details/6678165 http://bubkoo.原创 2015-05-19 15:54:44 · 727 阅读 · 0 评论 -
堆排序
概述 堆常用来实现优先队列,在这种队列中,待删除的元素为优先级最高(最低)的那个。在任何时候,任意优先元素都是可以插入到队列中去的,是计算机科学中一类特殊的数据结构的统称 堆的定义:最大(最小)堆是一棵每一个节点的键值都不小于(大于)其孩子(如果存在)的键值的树。大顶堆是一棵完全二叉树,同时也是一棵最大树。小顶堆是一棵完全完全二叉树,同时也是一棵最小树。注意: 堆中任一子树亦是堆。 以上讨论原创 2015-05-19 14:14:53 · 1224 阅读 · 0 评论 -
冒泡排序及快速排序
概述 冒泡排序法的基本思想:(以升序为例)含有n个元素的数组原则上要进行n-1次排序。对于每一躺的排序,从第一个数开始,依次比较前一个数与后一个数的大小。如果前一个数比后一个数大,则进行交换。这样一轮过后,最大的数将会出现称为最末位的数组元素。第二轮则去掉最后一个数,对前n-1个数再按照上面的步骤找出最大数,该数将称为倒数第二的数组元素……n-1轮过后,就完成了排序。 快速排序是冒泡排序的一原创 2015-05-18 15:35:51 · 700 阅读 · 0 评论 -
一致性哈希算法
概述 我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择。与常规的hash算法思路不同,只是对我们要存储数据的key进行hash计算,分配到不同节点存储。一致性hash算法是对我们要存储数据的服务器进行hash计算,进而确认每个key的存储位置。 常规hash算法的应用以及其弊端 最常规的方式莫过于hash取模的方式。原创 2015-05-21 15:36:59 · 801 阅读 · 0 评论 -
kmp字符串模式匹配算法
概述 kmp算法我觉得有两个关键点:1.计算模式字符串的部分匹配表(这时候,自己跟自己比较)2.匹配主串时候,主串字符只遍历一遍,匹配时候,根据模式串的部分匹配表计算模式串应该移动的位置。kmp算法时间复杂度为O(m+n);下面我实现的算法代码(PHP)理论关于kmp理论部分,这篇文章写得好:http://kb.cnblogs.com/page/176818/。我就不再赘述了。计算部分匹配表fun原创 2015-05-08 09:08:42 · 821 阅读 · 0 评论 -
哈希表算法
概述 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。理论http://b原创 2015-05-14 15:58:52 · 745 阅读 · 0 评论 -
二叉排序树
概述 二叉排序树又称“二叉查找树”、“二叉搜索树”。二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 理论参考http://www.cnblogs.com/zhuyf87/archive/2012/11/09/2763113.h原创 2015-05-12 16:01:12 · 642 阅读 · 0 评论 -
折半查找算法
概述 二分查找法主要是解决在“一堆数中找出指定的数”这类问题。而想要应用二分查找法,这“一堆数”必须有一下特征: 存储在数组中 有序排列 所以如果是用链表存储的,就无法在其上应用二分查找法了。(曽在面试被问二分查找法可以什么数据结构上使用:数组?链表?)至于是顺序递增排列还是递减排列,数组中是否存在相同的元素都不要紧。不过一般情况,我们还是希望并假设数组是递增排列,数组中的元素互不相同。理论参见:原创 2015-05-10 14:39:00 · 928 阅读 · 2 评论 -
查找-基于DFA的KMP字符串匹配
概述 基于DFA的KMP算法。是根据DFA状态转换表来实现。下面是java实现的代码理论关于kmp理论部分 1. 《算法》第4版。关于KMP算法讲解。 2. http://www.aichengxu.com/view/801445。 3. github上的某一种代码实现。可用于中文匹配的代码package StringSearch;import java.util.ArrayList; imp原创 2016-10-18 18:56:27 · 494 阅读 · 0 评论