随笔分类 -  算法

摘要:使用场景:Google 的 simhash 算法 //通过大量测试,simhash用于比较大文本,比如500字以上效果都还蛮好,距离小于3的基本都是相似,误判率也比较低。 //从我的经验,如果我们假定N是每个块的大小,M是重叠的字符的数目,N = 4和M = 3是最好的选择 public class SimHashAnalyser : IAnalyser { private const int HashSize = 32; public float GetLikenessValue(string needle, string haystack) ... 阅读全文
posted @ 2013-09-09 22:26 曾祥展 阅读(4358) 评论(2) 推荐(2) 编辑
摘要:冒泡排序(Bubble Sort)冒泡排序算法的运作如下:1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3.针对所有的元素重复以上的步骤,除了最后一个。4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。平均时间复杂度 /// /// 冒泡排序 /// /// /// public static void BubbleSort(int[] arr, int count) ... 阅读全文
posted @ 2013-09-06 18:27 曾祥展 阅读(1209) 评论(2) 推荐(0) 编辑
摘要:折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;B 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。C 如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度折半搜索每次把搜索区域减少一半,时间复杂度为。(n代表集合中元素的个数)空间复杂度 /// /// 二分查找 /// /// /// 开始索引 ... 阅读全文
posted @ 2013-09-06 17:44 曾祥展 阅读(11014) 评论(1) 推荐(0) 编辑
摘要:快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。步骤为:1.从数列中挑出一个元素,称为 "基准"(pivot),2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退 阅读全文
posted @ 2013-09-06 13:40 曾祥展 阅读(1949) 评论(1) 推荐(0) 编辑
摘要:方法一: //须添加对System.Web的引用 using System.Web.Security; ... /// <summary> /// SHA1加密字符串 /// </summary> /// <param name="source">源字符串</param> /// <returns> 阅读全文
posted @ 2010-01-30 11:35 曾祥展 阅读(33836) 评论(11) 推荐(15) 编辑