分类目录 ‘Algorithm’

一些重要的算法

作者: seasun

下面是一些比较重要的算法,原文罗列了32个,但我觉得有很多是数论里的或是比较生僻的,和计算机的不相干,所以没有选取。下面的这些,有的我们经常在用,有的基本不用。有的很常见,有的很偏。不过了解一下也是好事。也欢迎你留下你觉得有意义的算法。(注:本篇文章并非翻译,其中的算法描述 大部份摘自Wikipedia,因为维基百科描述的很专业了)
(全文…)

一般来说,我们会使用正规表达式来做字符串匹配,今天在网上浏览的时候,看到了有人用正则表达式来检查一个数字是否为素数(质数),让我非常感兴趣,这个正则表达式如入所示:
检查素数的正则表达式 | iwanna.cn 我想网检查素数的正则表达式/^1?$|^(11+?) +$/

要使用这个正规则表达式,你需要把自然数转成多个1的字符串,如:2 要写成 “11”, 3 要写成 “111”, 17 要写成“11111111111111111”,这种工作使用一些脚本语言可以轻松的完成。
(全文…)

近日翻看SICP,看到递归的部分,深有感触,遂记下所想所悟,如果有批评直言,望不吝赐教。

递归是实现程序计算过程中的描述过程 的基本模式之一,在讨论递归的问题前我们必须十分小心,因为递归包含两个方面的内容,一个是递归的计算过程,一个是递归过程,后者是语法上的事实而前者是 概念上的计算过程,事实上在程序上我们也许是使用循环来实现的。

一般在讨论递归的时候都喜欢用斐波那契数来作为例 子,我们也不要免俗。我们将斐波那契数的定义如下图来说明:
(全文…)

之前向大家介绍过《一个排序算法比较的网站》,那个网站用动画演示了各种排序算法,并分析了各种排序算法。这里,要向大家推荐一个 Python脚本,其可以把排序的过程给显示出来。

下图是“冒泡排序”的一个示例,其中:

  1. 折线表示了各个元素的位置变化。
  2. 折线的深浅表示了元素的大小。越深则越大。

(全文…)

下面这个网站是一个非常丰富的排序算法的网站。

Sorting Algorithm Animations
http://www.sorting-algorithms.com/

这是一个非常不错的排序算法的网站,当你打开这个网站的时候,请不要因为看到很多个图片的大红叉而鄙视它。你先点击网页上方的 Problem Size,选择一个尺寸,20,30,40还是50,都行,于是你就可以看到下面整个大表中有图片显示出来了。如下所示:

一个排序算法比较的网站
(全文…)

在平时的工作中,经常接到要对网站的会员进行站内信、手机短信、email进行群发信息的通知,用户列表一般由别的同事提供,当中难免会有重复,为了避免重复发送,所以我在进行发送信息前要对他们提供的用户列表进行排重,下面我以uid列表来讲讲我是如何利用php数组进行排重的。

假如得到一个uid列表,数量在百万行以上,格式如下:

10001000
10001001
10001002
......
10001000
......
10001111

其实利用php数组的特性,很好进行排重,我们先来看一下php数组的定义:PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。数组元素的值也可以是另一个数组。树形结构和多维数组也是允许的。
(全文…)

现在大部分SNS网站都有一个功能,就是显示好友的活动状态,比如你的好友上传了一张照片、分享了一篇文章等等动作,都可以显示在你的页 面里,这样大大增强了社区的互动性,也成为现在SNS网站的主要特征,对于这样一个功能,从设计角度,还是值得思考的,并不简单,特别是用户越来越多,信 息海量增长的时候,我未必能提出十全十美的方案,但我们可以由简如繁梳理一下思路。

首先我们要定义用户的活动消息,也可以理解为一个事件,就是我们举的例子:用户上传照片、与别人结为好友、修改了个人资料等等,动作各有不同,但需 要在结构上通用,我们先设计一个

ID //消息ID
UserID //用户ID
MsgType //消息类型,比如加好友、上传照片等不同的类型
EventMsg //消息的内容,这里我们可以用Json的数据格式来描述出不同的活动内容
CreateTime //消息创建时间
(全文…)

排序算法汇总

作者: seasun

一 排序的基本概念

所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来. 其确切定义如下:
输入: n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn.
输出: Ril,Ri2,…,Rin,使得Ki1 ≤ Ki2 ≤ … ≤ Kin.(或Ki1 ≥ Ki2 ≥ … ≥ Kin.)

(全文…)

一直想找到一个好的同义词解决方案,在百度和google查找,大家对于这个问题都只是寥寥数语,不愿讲清,我在javaeye搜此类信息也求不到,后来发了个提问贴也只有浏览数而无回复,不知道这是什么原因,无奈之下我只有自己研究。

因为没有其它的解决方案可以借鉴,以下纯为我个人的见解。 (全文…)

排序-插入

作者: seasun

插入排序算法比冒泡选择 略微复杂些,但效率好些。

插入排序总是假设指定位置的左边的数组是有序的,而后将指定位置的值插入左边的有序数组。

指定的位置从下标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();
}
}