算法
文章平均质量分 50
Dr-rong
这个作者很懒,什么都没留下…
展开
-
欧几里得算法与扩展欧几里得算法
原文:欧几里德是用来求最大公约数的,可以把它看成是状态转移,对任意两个数a,b(a>b),d=gcd(a,b),如果b不为零,那么gcd(a,b)=gcd(b,a%b) 证明: 令 r=a%b,即存在k,使得 a=b*k+r,那么r=a-b*k;显然r>=0, r%d=((a%d)-(b*k)%d)%d,因为a%d=b%d=0,所以r%d=0;因此求转载 2014-09-14 15:08:56 · 323 阅读 · 0 评论 -
找出n个数中最大的m个数的一些解决办法
方法1:排序后直接选出,这样时间开销为O(NlogN)方法2:先用选第k大元素的方法选出第k大元素(具体可以参考选第k大元素的那篇BLOG),按Knuth的说法,时间开销是O(n),这样的话,如果我们找到第n-m大的元素,设其为a,然后顺序扫描一遍原序列,即可以得到最大的m个数,这样做的前提是序列中没有重复元素。时间开销为O(n)方法3:构建一个m元最小堆,然后依次比较后续元素原创 2015-04-01 10:33:39 · 4184 阅读 · 0 评论 -
堆排序实现
堆排序可以保证最坏情况下的效率边界为O(nlogn)。如果直接用c++的priority_queue作为辅助结构来实现堆排序,会消耗额外O(n)的存储空间。我们可以直接在原数组上进行堆排序从而节省O(n)的空间开销。代码如下,利用了c的rand函数来实现随机输入。#include#include#includeusing namespace std;const int MAXN=原创 2015-04-01 09:56:01 · 500 阅读 · 0 评论 -
c++中如何访问数组的-1位置
今天在《编程珠玑》上看到的一个trick,如何访问数组的-1位置。其实这算是一种炫技的做法,现实中应该没有人会这样来写的吧?#includeusing namespace std;int main(){ int a[]={1,2,3,4,5}; int *b=a+1; for(int i=-1;i<5-1;++i) { cout<<原创 2015-03-24 11:03:43 · 954 阅读 · 0 评论 -
递归实现有序链表(不需要使用两个指针)
在使用有序链表作为基本数据结构时,当插入数据时,为了保持链表的有序性,我们需要两个指针来定位插入位置。通过递归我们可以巧妙的实现不要两个指针的做法。// SortedSingleList.cpp : Defines the entry point for the console application.//#include "stdafx.h"/*在单链表中有序插入元素时,一般使原创 2015-03-30 09:56:30 · 682 阅读 · 0 评论 -
Pattern Recognition and Machine Learning 读书总结(持续更新中)
花费了20天左右的时间浏览了一遍这部大块头,说说感受吧。原创 2015-03-12 16:46:04 · 757 阅读 · 0 评论 -
Boyer-Moore algorithm
参考给出的地址,说得比较详细http://blog.jobbole.com/52830/转载 2015-03-21 11:04:58 · 442 阅读 · 0 评论 -
快速排序的一些实现技巧(曾经被手写快排打倒过n+1次。。。)
首先是一个最简单的版本,与常见的双向扫描相比,这个只需要单向扫描即可,不容易出错,推荐手写时优先选择。m位置左侧包括m位置本身,是小于分割元素的,m位置右侧位置,是大于等于分割元素的。#includeusing namespace std;void qsort(int l,int r,int a[]){ if(l>=r) { return; }原创 2015-03-28 10:26:02 · 1696 阅读 · 0 评论 -
编写日历程序的注意事项
由于每一年开始的第一天总共只有7种可能(星期一至星期天),每一年只可能存在两种状态(闰年,平年),所以总共有7*2=14种可能,所以“基础”日历只有14种,这样在编写任意一年的日历时,只要保存对应“基础”日历的索引号即可。注:本想法来自《编程珠玑》原创 2015-03-26 11:01:35 · 537 阅读 · 0 评论 -
c++高效实现isupper,islower,isnum,isalpha的做法
看到《编程珠玑》代码调优一章,讲到了许多调优的细节,其中就讲到了如何高效实现这一组字符判断函数,关键是以空间换时间,进行缓存,以及通过位运算加速。下面是我的一个实现,使用到了函数对象。#include#includeusing namespace std;class Isalphanum{ public: char buffer[256];原创 2015-03-26 09:05:44 · 3060 阅读 · 1 评论 -
Python实现的一些常用日期函数
以下是一些常用的日期函数的实现,每个函数开头的注释中说明了函数的作用,问题的出处可以参考《编程珠玑》第三章练习题4def leapYear(year): """ decide whether year is leap year. for exmaple: 1900, not leap year 2000,leap year 2004,leap y原创 2015-03-19 12:23:45 · 496 阅读 · 0 评论 -
The Elements of Statistical Learning 读书总结(持续更新中)
第一遍读书总结 2015.02.23 :学长推荐的这本书,花了10天左右通读了一遍,由于之前看过点修炼“外功”的书和视频(programming collective intelligence、machine learning in action,以及coursera上stanford的PGM和NLP的视频,Ng的machine learning没能看下去,不太爱听Ng的发音),所以对这方面的原创 2015-02-23 17:45:34 · 2481 阅读 · 0 评论 -
Python版八皇后问题
def conflict(state, nextX): nextY = len(state) for i in range(nextY): if abs(state[i] - nextX) in (0,nextY-i): return True return Falsedef queens(num=8,state=()):原创 2014-11-17 19:31:46 · 455 阅读 · 0 评论 -
死磕傅里叶变换
参考:科学松鼠会(http://songshuhui.net/)关于buque原创 2014-06-21 10:48:20 · 1355 阅读 · 0 评论 -
欧拉函数
原文:http://blog.csdn.net/dream_ysl/article/details/7685880欧拉函数的定义:phi(n)表示在1~n中与n互质的数 难点: & 与平常的递推唯一不同的是:递推不是由(n-1)推来,这给想出推理过程带来了麻烦 & 如何充分使用互质这个概念,不像其他递推能够容易的列出递推关系 分析:转载 2014-09-14 15:45:42 · 298 阅读 · 0 评论 -
递归求排列组合-组合篇
#include#includeconst int MAXN=100;int arr[MAXN];int m=0;int n=0;int cnt=0;void zuhe(int num,int start,int len,int *arr){ if(num==0) { int i=0; for(;i<n;++i)原创 2014-07-14 13:28:43 · 436 阅读 · 0 评论 -
树的遍历:非递归形式
转自Leetcode论坛中一道关于树遍历题目的讨论:https://oj.leetcode.com/discuss/9736/accepted-code-with-explaination-does-anyone-have-better-ideaThere is an universal idea for preorder traversal inorder traversal and转载 2015-02-05 12:55:08 · 243 阅读 · 0 评论 -
利用后缀数组加速字符串搜索
我们比较常听到的字符串搜索算法如KMP,BM算法等,其算法均含有利用后缀数组进行字符串加速的想法。这里考虑一个比较单纯的利用后缀数组找出出现次数多于1次的最长子字符串,例子来自《编程珠玑》,具体解释可以参看书。关键思想是为文本进行预处理,从而得到其后缀数组表达形式,然后排序后比较相邻后缀即可得出出现次数多于1次的最长子字符串。#include#include#include#incl原创 2015-04-01 16:23:36 · 606 阅读 · 0 评论