七
23
2010
七
23
2010
七
23
2010
一般来说,我们会使用正规表达式来做字符串匹配,今天在网上浏览的时候,看到了有人用正则表达式来检查一个数字是否为素数(质数),让我非常感兴趣,这个正则表达式如入所示:
检查素数的正则表达式/^1?$|^(11+?) +$/
要使用这个正规则表达式,你需要把自然数转成多个1的字符串,如:2 要写成 “11”, 3 要写成 “111”, 17 要写成“11111111111111111”,这种工作使用一些脚本语言可以轻松的完成。
(全文…)
七
21
2010
近日翻看SICP,看到递归的部分,深有感触,遂记下所想所悟,如果有批评直言,望不吝赐教。
递归是实现程序计算过程中的描述过程 的基本模式之一,在讨论递归的问题前我们必须十分小心,因为递归包含两个方面的内容,一个是递归的计算过程,一个是递归过程,后者是语法上的事实而前者是 概念上的计算过程,事实上在程序上我们也许是使用循环来实现的。
一般在讨论递归的时候都喜欢用斐波那契数来作为例 子,我们也不要免俗。我们将斐波那契数的定义如下图来说明:
(全文…)
七
13
2010
之前向大家介绍过《一个排序算法比较的网站》,那个网站用动画演示了各种排序算法,并分析了各种排序算法。这里,要向大家推荐一个 Python脚本,其可以把排序的过程给显示出来。
下图是“冒泡排序”的一个示例,其中:
七
13
2010
下面这个网站是一个非常丰富的排序算法的网站。
这是一个非常不错的排序算法的网站,当你打开这个网站的时候,请不要因为看到很多个图片的大红叉而鄙视它。你先点击网页上方的 Problem Size,选择一个尺寸,20,30,40还是50,都行,于是你就可以看到下面整个大表中有图片显示出来了。如下所示:
六
8
2010
在平时的工作中,经常接到要对网站的会员进行站内信、手机短信、email进行群发信息的通知,用户列表一般由别的同事提供,当中难免会有重复,为了避免重复发送,所以我在进行发送信息前要对他们提供的用户列表进行排重,下面我以uid列表来讲讲我是如何利用php数组进行排重的。
假如得到一个uid列表,数量在百万行以上,格式如下:
10001000 10001001 10001002 ...... 10001000 ...... 10001111
其实利用php数组的特性,很好进行排重,我们先来看一下php数组的定义:PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。数组元素的值也可以是另一个数组。树形结构和多维数组也是允许的。
(全文…)
六
1
2010
现在大部分SNS网站都有一个功能,就是显示好友的活动状态,比如你的好友上传了一张照片、分享了一篇文章等等动作,都可以显示在你的页 面里,这样大大增强了社区的互动性,也成为现在SNS网站的主要特征,对于这样一个功能,从设计角度,还是值得思考的,并不简单,特别是用户越来越多,信 息海量增长的时候,我未必能提出十全十美的方案,但我们可以由简如繁梳理一下思路。
首先我们要定义用户的活动消息,也可以理解为一个事件,就是我们举的例子:用户上传照片、与别人结为好友、修改了个人资料等等,动作各有不同,但需 要在结构上通用,我们先设计一个
ID //消息ID
UserID //用户ID
MsgType //消息类型,比如加好友、上传照片等不同的类型
EventMsg //消息的内容,这里我们可以用Json的数据格式来描述出不同的活动内容
CreateTime //消息创建时间
(全文…)
五
3
2009
一 排序的基本概念
四
9
2009
一直想找到一个好的同义词解决方案,在百度和google查找,大家对于这个问题都只是寥寥数语,不愿讲清,我在javaeye搜此类信息也求不到,后来发了个提问贴也只有浏览数而无回复,不知道这是什么原因,无奈之下我只有自己研究。
因为没有其它的解决方案可以借鉴,以下纯为我个人的见解。 (全文…)
三
31
2009
插入排序总是假设指定位置的左边的数组是有序的,而后将指定位置的值插入左边的有序数组。
指定的位置从下标1开始,每次循环递增1,直到数组结束。
插入排序的比较次数与交换次数的时间效率均为O(n^2),确切的说是O(n^2 / 4),比冒泡排序快一倍。
对于一个基本有序数组,由于内循环基本都是空循环,插入排序的效率接近O(n),但对于完全逆序数组,插入排序的效率与冒泡相同。因此插入排序对于 基本有序,或反复排序的数组比较有利,实是上插入排序常常用于其他排序的首尾工作,其他排序只要排到基本有序即可,比如快速排序。
下面是代码。
class Insert {
public static void main(String[] args) {
int[] a = {1,5,3,8,4,3,8};
sort(a);
print(a);
}
private static void sort(int[] a) {
int temp;
for(int i=1; i<a.length; i++) {
int pos = i; //确定位置,在此位置左边的数组是有序的。
temp = a[i]; //根据位置确定要插入的数值。
while(pos>0 && a[pos-1]>temp) { //选择第一个不大于要插入数值的的位置
a[pos] = a[pos - 1]; //将数据以此向后移动
pos–;
}
a[pos] = temp; //将指定数值插入恰当位置
}
}
private static void print(int[] a) {
for(int i: a) System.out.print(i + ” “);
System.out.println();
}
}