编码之美
xiaofengsheng
这个作者很懒,什么都没留下…
展开
-
编程中的命名设计那点事
在我开始设计系统的时候,我会花去很多事情去设计命名,因为好的命名和好的设计是分不开的。In the beginning was the Word, and the Word was with God, and the Word was God太初有道。道与神同在,道就是神。 (约翰福音第一章,第一节)在设计过程中给类,方法和函数好的命名会带来好的设计,虽然这不是一定成立,但是如果坏的命名那转载 2009-06-07 18:19:00 · 891 阅读 · 0 评论 -
编程之美: 24点游戏的解法
分治法:把A={e,f,a,b}分治成为B={e,f,a+b}, C={e,f,a-b}, D={e,f,b-a}, E={e,f,a*b}, F={e,f,a/b}, G={e,f,b/a} 这样5个元素个数等于3的集合.这样就把A中元素运算等于24, 转化为B或C或D或E或F或G中元素运算等于24.这展示了有关集合运算的一种方法: 元素合并, 转化为元素更少的集合.Code:原创 2010-04-22 20:31:00 · 1719 阅读 · 1 评论 -
优雅地反转链表
反转单向链表的程序.我给的代码是递归的实现, 运用递归就可以避免很多特殊情况的考虑, 看起来也比较优雅. #include #include #include using namespace std;template struct Node{ T data; Node* next;};template void createLis原创 2010-04-23 01:11:00 · 668 阅读 · 0 评论 -
KMP算法
在A串中寻找B串.一般的寻找子字符串的算法复杂度是O(m*n), KMP字符串匹配算法的时间复杂度仅为: O(m+n), 速度惊人.它与C/C++语言中的strstr()函数的实现应该是一致的,不过在C/C++它用汇编实现了这些代码,估计string类的string::substr也是这样实现的。这个算法的实现部分Matrix67大牛有详细的介绍,.不再赘述. 下面贴出实现代码:原创 2010-04-14 23:07:00 · 970 阅读 · 0 评论 -
求二项式因子的算法
组合数C(n, k)的求法:1. 浮点数迭代法缺点: 当数比较大的时候, 可能结构不够精确.使用公式#include using namespace std;int main(){ long double n, k, ans; while(cin >> n >> k && (n || k)){ ans = 1; if(k > n/2) k原创 2010-04-01 20:49:00 · 1471 阅读 · 1 评论 -
怎样找下一个序列: next_permutation
有一序列 1 6 3 5 4 2 end (其中最后一个数后面的一个数记为end) 他的字典序的下一个排列会是什么呢? 1. 我们可以从后往前找到第一个降序对(x, y), 因为[y, end)已经是降序的, 在[y, end)中已没有数拿来交换, 可以让这个序列变大, 相反, 反而会变小. 所以说[y, end)已经不可能再变大, [x, end)才会变大. 即, 1原创 2010-04-13 12:29:00 · 894 阅读 · 0 评论 -
乘方(幂)算法比较
#include #include //m>=0, n>=0int power1(int m, int n){ if(n == 0) return 1; if(n == 1) return m; if(n&1) return m*power1(m, n-1); else { int v = power1(m, n>>1);原创 2010-03-28 23:59:00 · 1059 阅读 · 1 评论 -
C++: 如果像定义endl(换行)一样定义tab(制表符)
一个简单的tab是这样实现的:#include using namespace std;inline basic_ostream >& tab(basic_ostream >& out){ out.put(/t); out.flush(); return (out);}int main(){ cout << tab << "World" <原创 2010-03-13 10:40:00 · 3094 阅读 · 0 评论 -
开放定址Hash法
开放定址Hash法 void get_hash(int k, int d){ while(v[k]) k = (k + 1)%PRIME; hash[k] = d; v[k] = 1; return;}bool find_hash(int k, int d){ while(v[k] && hash[k] != d)原创 2009-12-27 11:23:00 · 748 阅读 · 0 评论 -
推荐: 贪心算法的一个出人意料的应用
这篇文章是在Matrix67大牛博客上挖的, 这个问题囊括了二分查找和贪心算法(Huffman法)两种查找最优问题的算法.十分值得推荐.贪心算法的强大,领略无遗. 原文地址: http://www.matrix67.com/blog/archives/2605 IBM Ponder This上个月的题目比较有趣:我在心里面想一个2到166之间的整数(包括2和166),你的任务转载 2009-12-23 13:23:00 · 762 阅读 · 0 评论 -
编程珠玑的一些笔记
位操作: 关于除法, 取模i >> SHIFT i/32i&MASK i%32 [大于32的部分(是32的倍数)都被与掉] #define N 10000000#define SHIFT 5#define MASK 0x1f#define BITSPERWORD 32int a[N/BITSPERWORD+1]; void set_bit(int i)原创 2010-02-24 13:39:00 · 736 阅读 · 0 评论 -
求逆序数的分治算法
给我们一个序列, 让我们求其逆序数:如3 2 1 4逆序数为: 2+1+0+0=3 我们这样定义一个序列的逆序数: 序列a1 a2 a3 a2 ...an这个序列的逆序数C, 等于a1,a2...的逆序数的和.即 C=sum(Ci)Ci为满足ai > aj (j > i)的数的总的个数, 即Ci = sum(ai > aj) (j >i). 我们一般写的算法一般会做原创 2010-04-15 23:23:00 · 8020 阅读 · 1 评论