![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
desionwang
这个作者很懒,什么都没留下…
展开
-
动态规划:从新手到专家(转载)
前言本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的一些理解。水平有限,还望指摘。前言_我们遇到的问题中,有很大一部分可以用动态规划(简称DP)来解。 解决这类问题可以很大地提升你的能力与技巧,我会试着帮助你理解如何使用DP来解题。 这篇文章是基于实例转载 2013-07-24 17:59:45 · 877 阅读 · 0 评论 -
堆排序实现及应用
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。原创 2014-09-30 18:02:44 · 1389 阅读 · 0 评论 -
X的N次方求解——pow(x,n)实现
最近看到这样的一个题目求X的N次方,自己想了一些解决办法,记录一下留作日后参考原创 2014-09-29 16:34:51 · 16013 阅读 · 1 评论 -
排序算法总结
排序算法算是比较基本的算法,同时也是最重要的算法,涉及到的知识也比较多,下面记录一下各种排序算法的实现,包括插入排序,选择排序,快速排序,归并排序,冒泡排序等常见的排序算法:原创 2014-09-29 13:44:14 · 869 阅读 · 0 评论 -
二叉树遍历
二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的)。下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现。转载 2014-09-24 15:57:24 · 671 阅读 · 0 评论 -
求数组连续最大和
面试的时候已经不是第一次遇到这个问题,该问题的解法也非常的多,穷举,分治,DP,扫描,复杂度也不尽相同,可以说题目很小,但是蕴含的技巧和算法知识却很多。题目大致如下:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组原创 2013-12-03 10:59:27 · 2204 阅读 · 0 评论 -
simhash(局部敏感哈希)的原理及应用
simhash广泛的用于搜索领域中,也许在面试时你会经常遇到这样的问题,如果对抓取的网页进行排重,如何对搜索结果进行排重等等。随着信息膨胀时代的来临,算法也在不断的精进,相似算法同样在不断的发展,接触过lucene的同学想必都会了解相似夹角的概念,那就是一种相似算法,通过计算两个向量的余弦值来判断两个向量的相似性,但这种方式需要两两进行计算向量的余弦夹角,计算量比较大,不能用于实时计算或是大数据量原创 2013-11-20 13:55:45 · 7140 阅读 · 0 评论 -
最小编辑距离(Minimum edit distance)
最小编辑距离是计算欧式距离的一种方法,可以被用于计算文本的相似性以及用于文本纠错,因为这个概念是俄罗斯科学家 Vladimir Levenshtein 在1965年提出来的,所以编辑距离又称为Levenshtein距离。原创 2014-06-16 22:28:45 · 2045 阅读 · 0 评论 -
最长回文串算法
给定一个字符串找出最长回文字符串范围,例如abaabac,最长回文为abaaba1、使用暴力的算法需要O(N^3)的复杂度,需要O(N^2)的复杂度去运算字符串所用的子串,然后使用O(N)去判断是否是回文串,从而定位最长的回文子串。2、使用动态规划的思想进行求解,思路是利用子串从短到长进行逐步的动态规划求解,然后从短向长蔓延进行计算:当i == j 时 肯定是长度为1 的回文串,dp[原创 2013-09-30 10:08:15 · 5495 阅读 · 0 评论 -
字符串按单词(term)反转(C代码)
有一个英文句子,每个单词(term)之间用空格分隔,例如:I like English very much 要求反转后变为 much very English like I上面的问题可以利用C语言中字符串已'\0'结尾,且'\0'是字符串打印的截止符,代码如下:#include #include void reverse(char *s){ int len = strlen(s)原创 2013-05-10 17:13:37 · 1902 阅读 · 0 评论 -
求k个数组包含每个数组至少一个元素的最小范围(待字闺中,备忘)
有k个有序的数组,请找到一个最小的数字范围。使得这k个有序数组中,每个数组都至少有一个数字在该范围中。例如:1: 4, 10, 15, 24, 262: 0, 9, 12, 203: 5, 18, 22, 30所得最小范围为[20,24],其中,20在2中,22在3中,24在1中。这是待字闺中的一道面试题,就个人经原创 2013-10-23 15:47:16 · 3523 阅读 · 1 评论 -
Bloom Filter原理及使用
有过搜索经验的同学们都知道,当进行网页抓取的时候都会遇到url排重的问题,当然这也是面试经常遇到的问题,同学们可能会想到很多的方法去解决这个问题,比如用数据库,kv系统,bitmap等等,但是都由于种种问题不能完全的解决掉排重的问题,数据库在大数据量和高访问量的时候往往会不尽人意,kv库会很耗内存,bitmap会出现很高的冲突率,这时候bloomfilter就成为了很好的选择,一方面是基于内存的具原创 2013-10-18 13:35:17 · 3387 阅读 · 0 评论 -
强制转换和数组下标的妙用
前两天看到一篇文章是些如何不用+做加法的算法,其中有人提到可以这样实现:int add(int a,int b){ char * c; c = (char *) a; return (int)&c[b];}理解了半天,现在做一下记录,防止自己忘记将一个整形强制转化为指针,其实指针的指向的地址就是该整数的值,例如a是10的话那么c指向的地址就是0xa,使用数组下标其原创 2013-07-28 10:11:07 · 976 阅读 · 0 评论 -
硬币找零问题(动态规划求解)
如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出解,比如1元换成2元的时候)首先我们思考一个问题,如何用最少的硬币凑够i元(i好了,让我们从最小的i开始吧。当i=0,即我们需要多少个硬币来凑够0元。 由于1,3,5都大于0,即没有比0小的币值,因此凑够0元我们最少需要0个硬币。 (这个分析很傻是不是原创 2013-07-26 22:10:17 · 19569 阅读 · 5 评论 -
数字二进制中1的个数
给定一个数字求该数字二进制中1的个数被广泛应用于simhash中,求两个hash值得相似程度可以先将两个hash值做异或操作,然后统计异或结果二进制中1的个数来判断两个hash值得相似性。 言归正传,求数字二进制中1的位数最直观的解法为所求数字不断的向右移位>>直到为0,统计移位过程中最低位是否是1,这样需要移位32~64位,代码如下:int bitcout1(uint32_t nu原创 2013-07-25 10:32:39 · 1055 阅读 · 0 评论 -
最长重复子串问题
最长重复子串是指在一个字符串中找出最长的出现两次或两次以上的子串,例如abcdeabbcde,则bcde则是最长的重复子串。最直观的解法是穷举所有的子串,和原串进行对比,从而选出最长的重复子串。#include #include int commonLen(const char *str1, const char *str2){ int len = 0;原创 2013-07-24 17:29:55 · 1661 阅读 · 0 评论 -
旋转数组求最小值
这是letcode上的一道题目 Leetcode: Find Minimum in Rotated Sorted Array一、什么是旋转数组呢,就是一个有序的数组,在从某一个位置开始,旋转到数组的另一端,例如:0 1 2 3 4 5 6 -> 4 5 6 0 1 2 3二、使用暴力的方式就是遍历这个数组,算法的复杂度就是O(N),但是根据一般的经验提到有序,就会考虑到使用二分将算法的复杂度降低到O(logn),当然这个题目也不例外,但是如何利用二分去求解呢,毕竟不是全部有序。原创 2014-10-29 17:34:27 · 1094 阅读 · 0 评论