Algorithm
stevsun
Keep calm and carry on
展开
-
Go堆排序
package mainimport "fmt"// Heap 定义堆排序过程中使用的堆结构type Heap struct { arr []int // 用来存储堆的数据 size int // 用来标识堆的大小}// adjustHeap 用于调整堆,保持堆的固有性质func adjustHeap(h Heap, parentNode int) ...转载 2020-04-09 22:24:44 · 341 阅读 · 0 评论 -
Go单链表反转
package mainimport ( "fmt")type Node struct { Val int Next *Node}func reverse(listNode *Node) *Node { var node *Node head := listNode for head != nil { head.Nex...原创 2020-04-03 23:38:37 · 1410 阅读 · 0 评论 -
Go遍历二叉树
package main import "fmt"type Node struct { Val int Left *Node Right *Node}// 1// / \// 2 3// / \ / \// 4 5 6 7func main() { head := &No...原创 2020-04-08 17:21:59 · 348 阅读 · 0 评论 -
Go二分查找
package mainimport "fmt"func main() { data := []int{1,2,3,4,5,8,10} fmt.Println(binFind(data,8)) fmt.Println(binFind(data,9))}func binFind(data []int, item int) int { if len(dat...原创 2020-03-27 12:48:47 · 435 阅读 · 0 评论 -
经典的 Top K 问题
什么是 Top K 问题?简单来说就是在一堆数据里面找到前 K 大(当然也可以是前 K 小)的数。这个问题也是十分经典的算法问题,不论是面试中还是实际开发中,都非常典型。而这个问题其实也有很多种做法,你真的都懂了么?一. 立刻就能想到的解法既然是要前 K 大的数,那么最直接的当然就是排序了,通过如快排等效率较高的排序算法,可以在平均 O(nlogn)的时间复杂度找到结果。这种方式在数据量不...转载 2020-03-18 22:35:54 · 383 阅读 · 1 评论 -
布隆过滤器的详解与应用
一、什么是Bloom FilterBloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(Bit array)中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检索元素一定不在;如果都是1,则被检索元素很可能在。这就是布隆过滤器的基本思想...转载 2020-03-17 22:35:58 · 234 阅读 · 0 评论 -
Hash算法
概述Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 Hash主要...转载 2020-03-16 15:45:21 · 476 阅读 · 0 评论 -
Go归并排序
package mainimport "fmt"func main() { data := []int{8, 9, 5, 7, 1, 2, 5, 7, 6, 3, 5, 4, 8, 1, 8, 5, 3, 5, 8, 4} fmt.Println(data) data = mergeSort(data) fmt.Println(data)}func m...原创 2020-03-14 14:51:18 · 237 阅读 · 0 评论 -
短链接算法原理
平时我们在上网的时候,印象最深刻的有一次是短链接的服务。例如:平时在微信上看一个网页的时候,如果我们选择在浏览器打开的时候,会看到很长的URL,我们分享的时候,会看到一个很短URL,这就是本次所说的短链接的应用之一。长链接示例:https://mp.weixin.qq.com/s?__biz=MzAxNzMwOTQ0NA==&mid=2653355437&idx=1&sn...转载 2020-03-09 23:30:13 · 1499 阅读 · 0 评论 -
一致性哈希详解
文章目录一、Redis集群的使用二、为Redis集群使用Hash三、使用Hash的问题四、一致性Hash算法的神秘面纱五、一致性Hash算法的容错性和可扩展性六、Hash环的数据倾斜问题七、一致性体现在哪里一、Redis集群的使用我们在使用Redis的时候,为了保证Redis的高可用,提高Redis的读写性能,最简单的方式我们会做主从复制,组成Master-Master或者Master-Sla...转载 2020-03-02 23:13:08 · 473 阅读 · 0 评论 -
最长回文子串(php)
<?php/**************** 暴力解法 ****************/class Solution { /** * @param String $s * @return String */ function longestPalindrome($s) { $len = strlen($s); ...转载 2019-10-14 15:27:29 · 600 阅读 · 0 评论 -
查找两个链表的交叉节点
问题描述 给定两个单链表,查找这两个单链表的交叉节点。例如:链表listA为:a1→a2→c1→c2→c3,链表listB为:b1→b2→b3→c1→c2→c3。那么这两个的第一个交叉节点为c1。 方法与思路 首先,观察一下交叉节点的特点。如果两个链表有交叉节点的话,那么这个交叉节点之后的其他节点都是相同的,也就是说两个链表的结构应该是Y字型的。 也就是说,c1之后的节点都是交转载 2017-11-01 20:33:01 · 1579 阅读 · 0 评论 -
PHP实现快速排序
写了三种php快速排示例: 第一种效率低但最简单最容易理解, 第二个是算法导论上提供的单向一次遍历找中值方法, 第三种是双向遍历找中值经典快排算法。 三组算法实现和比较如下:方法一:该方法比较直观,但损失了大量的空间为代价,使用了效率较低的merge函数。在三种方法中效率最低。最坏情况下算法退化为(O(n*n))function quick_sort($array) { if(cou转载 2017-02-20 19:27:40 · 2746 阅读 · 2 评论 -
PHP实现单链表
class Node { public $data = ''; public $next = null; public function __construct($data = ''){ $this->data = $data; }}//添加节点function addNode($head,$data){ $cur = $head;原创 2017-02-20 18:00:54 · 434 阅读 · 0 评论 -
五大常用算法之五:分支限界法
一、基本描述 类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。(1)分支搜索算法 所谓“分支”就是采用广度优先的策略,依次搜索转载 2015-06-02 23:28:03 · 441 阅读 · 0 评论 -
五大常用算法之四:回溯法
1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 许多复转载 2015-06-02 23:28:01 · 706 阅读 · 0 评论 -
五大常用算法之三:贪心算法
一、基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。转载 2015-06-02 23:27:58 · 393 阅读 · 0 评论 -
五大常用算法之二:动态规划算法
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求 解任一子问题时,列出各种可能的局部解,转载 2015-06-02 23:27:55 · 589 阅读 · 0 评论 -
五大常用算法之一:分治算法
一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其转载 2015-06-02 23:27:53 · 556 阅读 · 0 评论 -
数组最长连续递增(+1)子序列
$arr = [9,8,3,4,5,6,7,10];//$arr = [1,2,3,4,5,6,7,8,10,10,11,12,13];function poker($arr){ sort($arr); $cur = $arr[0]; $res = array(); $tmp = array($cur); for($i = 1;$i<count($...原创 2017-11-30 19:27:42 · 681 阅读 · 0 评论 -
走迷宫回溯算法(Java实现)
以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 (1) 根据二维数组,输出迷宫的图形。 (2) 探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径。 例子: 左上角(1,1)为入口,右下角(8,9)为出口。 可使用回溯方法,转载 2015-08-25 15:28:50 · 13685 阅读 · 1 评论 -
如何判断两个链表相交及找到第一个相交点
我们学一个算法,一定是为了用吧,所谓“学以致用”吗?那么判断两个链表是否相交有什么用呢?这是因为一旦两个链表出现相交的情况,就可能发生这样的情况,程序释放了链表La的所有节点,这样就导致了另外一个与之有相交节点的链表Lb中的节点也释放了,而Lb的使用者,可能并不知道事实的真相,这会带来很大的麻烦。1.问题分析 看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环) (1)一转载 2017-11-01 20:35:29 · 687 阅读 · 0 评论 -
如何判断单链表是否存在环
给定一个单链表,只给出头指针h: 1、如何判断是否存在环? 2、如何知道环的长度? 3、如何找出环的连接点在哪里? 4、带环链表的长度是多少?解法: 1、对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。 2、对于问题2,记录下问题1的碰撞点p,slow、fast从该点开始,再次碰转载 2017-11-15 16:36:46 · 297 阅读 · 0 评论 -
白话经典算法系列之五 归并排序的实现
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。//将有序数组a[]和b[]合并到c[]中void MemeryArra转载 2015-09-24 19:12:14 · 425 阅读 · 0 评论 -
一个整型数组里除了两个数字之外,其它的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是o(n),空间复杂度是o(1)。
考虑过程:首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0 。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些出现两次的数字全部在异或...转载 2019-02-12 14:51:20 · 436 阅读 · 0 评论 -
PHP 括号匹配
function func($str){ $stack = []; $map = [ ']'=>'[', ')'=>'(', ]; for($i=0;$i<strlen($str);$i++){ if(in_array($str[$i],array_values($map))){ ...原创 2018-03-29 15:59:46 · 775 阅读 · 0 评论 -
PHP-利用堆实现TopK-算法
介绍在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证内存和速度的效率,我们可能第一个想法就是利用排序,然后截取前10或前100,而排序对于量不是特别大的时候没有任何问题,但只要量特别大是根本不可能完成这个任务的,比如在一个数组或者文本文件里有几亿个数,这样是根本无法全部读入内存的,所以利用排序解决这个问题...转载 2018-03-15 15:17:04 · 688 阅读 · 1 评论 -
PHP实现二分查找
循环function binary(&$arr,$low,$top,$target){ while($low <= $top){ $mid = floor(($low+$top)/2); echo $mid."<br>"; if($arr[$mid]==$target){ return...原创 2017-02-23 23:27:19 · 502 阅读 · 0 评论 -
PHP合并两个有序数组
$arr1 = array(1,2,3,4,5,6,7,8);$arr2 = array(3,4,5,7,9,10);//方法1function mergeOrderly1($arr1,$arr2){ $i=0;$j=0; $int = array(); while($i<count($arr1) && $j<count($arr2)){...原创 2017-03-15 14:46:56 · 2783 阅读 · 0 评论 -
数组灌水问题
$arr = [1,3,2,4,6,1,6,1,3,2];function water($arr){ $top = 0; $sum = 0; for($i=1;$i<count($arr);$i++){ if($arr[$top] <= $arr[$i]){ $top= $i; } } ...原创 2017-11-30 20:00:42 · 378 阅读 · 0 评论 -
PHP约瑟夫环问题
循环function circle($arr,$idx,$k){ for($i=0;$i<$idx;$i++){ $tmp = array_shift($arr); array_push($arr,$tmp); } $j = 1; while(count($arr) > 0){ $tmp = array...原创 2017-12-02 17:11:23 · 582 阅读 · 0 评论 -
求连续子数组的最大和
#include <iostream.h> #define n 4 //多定义了一个变量 int maxsum(int a[n]) //于此处,你能看到上述思路2代码(指针)的优势 { int max=a[0]; //全负情况,返回最大数 int sum=0; for(int j=0;j<n;j++)原创 2017-11-30 19:11:39 · 297 阅读 · 0 评论 -
PHP字符串全排列
方法一:$str = 'abc';$a =str_split($str);perm($a, 0, count($a)-1);function perm(&$ar, $k, $m) { if($k == $m){ echo join('',$ar), PHP_EOL; }else { for($i=$k; $i<=$m; $i++) {原创 2016-02-21 00:17:28 · 5799 阅读 · 0 评论 -
PHP实现二叉树遍历(非递归方式,栈模拟实现)
二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(Pos转载 2016-02-18 16:37:04 · 1237 阅读 · 0 评论 -
计数排序、桶排序和基数排序
计数排序当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量内存。计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计数排序可以用原创 2016-02-18 13:05:26 · 449 阅读 · 0 评论 -
白话经典算法系列之十二 数组中只出现1次的两个数字(百度面试题)
首先来看题目要求:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找出这个数字。这个题目在之前的《位操作基础篇之位操作全面总结》中的“位操作趣味应用”中就已经给出解答了。根据异或运算的特点,直接异或一次就可以找出这个数字。现在数组中有两个数字只出现1次,直接异或一次只能得到这两个数转载 2015-09-24 19:59:29 · 492 阅读 · 0 评论 -
白话经典算法系列之十一 一道有趣的GOOGLE面试题 --【解法2】
上一篇《白话经典算法系列之十一道有趣的GOOGLE面试题》中对一道有趣的GOOGLE面试题进行了详细的讲解,使用了类似于基数排序的做法在O(N)的时间复杂度和O(1)的空间复杂度完成了题目的要求,文章发表后,网友fengchaokobe在评论中给出了另一种解法,见下图。 文字版:int Repeat(int *a, int n) { for(int i = 0; i < n; i+转载 2015-09-24 19:55:42 · 524 阅读 · 0 评论 -
白话经典算法系列之十 一道有趣的GOOGLE面试题
最近在微博上看到一道有趣的GOOGLE面试题,见下图: 文字版: 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。这个题目要求用O(n)的时间复杂度,这意味着只能遍历数组一次。同时还要寻找重复元素,很容易想到建立哈希表来完成,遍历数组时将每个元素映射到哈希表中,如果哈希表中已经存在这个元素则说明这就是个重复元素。因转载 2015-09-24 19:49:54 · 506 阅读 · 0 评论 -
白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
首先来看看原题微软2010年笔试题: 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。计算数列的逆序数对个数最简单的方便就最从前向后依次统计每个数字与它后面转载 2015-09-24 19:45:29 · 470 阅读 · 0 评论 -
白话经典算法系列之八 七大排序总结篇
在我的博客对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载。下载地址为:http://download.csdn.net/detail/morewindows/4443208。 有网友提议到这本《MoreWindows白话经典算法之七大排序》电子书讲解细致用来平时学习是非常好的,但是页数有22转载 2015-09-24 19:41:13 · 565 阅读 · 0 评论