Archive for the 'IT' Category

斐波那契数列

前几天碰到一道题求斐波那契数列的非递归算法,用最简单的逐项累加,O(n)复杂度,然后被某搞过ACM的同学bs,说有O(logn)的算法。去poj上搜,果然有这个题。去wikipedia上查了下,除了Fn/Fn+1接近黄金分割比外,斐波那契数列还有一些有趣的特性,而算法便是基于这一等式:

利用二进制快速乘方(a11 = a8.a2.a =1 . a23. 0 . a22. 1. a21. 1 . a20)的方法,时间复杂度可成功降为O(logn)

poj3070,给定n(0<=n<= 1,000,000,000), 输出Fn模10000的值

代码如下:

//poj 3070
//Triton

#include <stdio.h>

//mod 10000 以减小数值范围
int matrixMultiply(long *a, long *b, long *answer)
{
    long tmp[4];
    tmp[0] = (a[0] * b[0] + a[1] * b[2])%10000;
    tmp[1] = (a[0] * b[1] + a[1] * b[3])%10000;
    tmp[2] = (a[2] * b[0] + a[3] * b[2])%10000;
    tmp[3] = (a[2] * b[1] + a[3] * b[3])%10000;
    int i;
    for(i = 0; i < 4; ++i){
        answer[i] = tmp[i];
    }
    return 0;
}

int matrixPower(long n, long *answer)
{
    int i;
    if(n < 0){
        for(i = 0; i < 4; ++i)  answer[i] = 0;
    }
    else{
        long pre[4];
        long cur[4] = {1,1,1,0};
        long res = n;
        long rem = res % 2;
        answer[0] = 1;
        answer[1] = 0;
        answer[2] = 0;
        answer[3] = 1; //初始化为单位矩阵
        //利用二进制快速乘方
        while(res != 0){
            if(rem == 1)    matrixMultiply(cur,answer,answer);
            i = 0;
            for(i = 0; i < 4; ++i){
                pre[i] = cur[i];
            }
            matrixMultiply(pre, pre, cur);
            res >>= 1;
            rem = res % 2;
        }
    }
    return 0;
}

int main()
{
    long num;
    long answer[4];
    while(1){
        scanf("%ld",&num);
        if(num != -1){
            matrixPower(num,answer);
            printf("%d\n", answer[1]%10000);
        }
        else break;
    }
    return 0;
}

同学看我做这个题,给了另一个模板编程的代码(汗,从来没用过),好处是运行很快,据说游戏中经常用类似的模板编程

#define Fib(N) FibT<N>::Val
template<int n> struct FibT
{
	enum
	{
		Val = FibT<n-1>::Val + FibT<n-2>::Val
	};
};

template<> struct FibT<0>
{
	enum
	{
		Val = 0
	};
};

template<> struct FibT<1>
{
	enum
	{
		Val = 1
	};
};

即使是看起来很简单的斐波那契数列,也有许多值得探究的地方。路漫漫其修远兮,吾将上下而求索

一个简单的flex箭头图表

项目需求,要做一个箭头图表,还要有滑动动画。参考Flex 3 SDK和Google上一位老外的代码,做了个简单的出来,基本满足需求了,以后有兴趣再扩充吧。

箭头图表类似于Flex内置的各种图表,不过简单多了(本想从ChartBase之类的继承,但看到那几个包和众多的类,我无力了),从UIComponent继承而来的,只实现了series,dataProvider,xField,yField等属性,还有showDataEffect用来配合动画。(没有hideDataEffect – -)

滑动动画主要用了scrollRect这个属性,已知有两个bug:有时候箭头的滑动会有跳动的感觉,动画开始时如果前一个动画没运行完,会报错。暂时没找到原因,先不管了。

演示如下,可右键看源代码。

最后,吐一下Firefox的槽,感觉3.6.4增加的插件隔离机制没什么用,插件奔溃fx照样奔溃,而且,更频繁了。类似空对象引用,数组越界(我羞愧),找不到url之类的错误都能引起奔溃。当然,更可能是debug player的缘故。HTML5快点来吧,让flash player见鬼去。

flex中的括号

初学flex时,被里面四处乱飞的括号弄得有点头晕,尤其是一些不同于C,Java中用法的地方。碰到

var ac:ArrayCollection = new ArrayCollection([{name:"foo",no:0},{name:"bar",no:1}]);

这种兄弟仨一起出场的时候更是无措。

仔细翻了翻文档,总结一下,顺便测试下Easy Google Syntax Highlighter插件:

  • 小括号( ):nothing new,就两个作用:改变表达式运算顺序,小学生都会的东西;传递函数参数,传统用法
  • 大括号{ }:as3 中,两个作用:代码块,还是传统;实例化Object类的对象(实例),如
    var obj:Object = {id:0,label:"object",date:"2010.6.22"};

    MXML中,用于嵌入内联的as代码或数据绑定(其实数据绑定也可以看作as代码),如

    <!-- code block -->
    <mx:Button label="click to say hello" click="{mx.controls.Alert.show('hello world')}" />
    
    <!-- data binding -->
    <mx:TextInput id="input" x="10" y="10" width="100" />
    <mx:Text text="{input.text}" x="200" y="10" />
  • 中括号[ ]:as3中,两个作用:初始化数组,这点与C和Java用{ }不一样,很多误读就是这么产生的,如
    var arr:Array = ["foo","bar","foobar"];

    插入元数据标签(metadata tag)如Bindable,Embed,Effect等,最常见的就是用于绑定的Bindable,如

    [Bindable]
    private var arr:Array;

    又如以下代码在MyComponent组件上定义myClickEvent事件

    [Event(name="myClickEvent", type="flash.events.Event")]
    public class MyComponent extends UIComponent{
    //...
    }
    

    在MXML中部分元数据标签可使用<mx:Metadata>标签插入,(绑定用<mx:Binding>)作用与脚本相同,如以下代码定义textSelectedColor的样式

    <mx:Metadata>
    [Style(name="textSelectedColor",type="Number",format="Color")]
    </mx:Metadata>
    

    关于<![CDATA[ ]]>,这里的中括号与as3无关,是XML的标准语法,XML解析器会自动忽略CDATA里的内容,MXML同样遵守这一规则

  • 尖括号< >:姑且也算吧,没什么好说的,定义和关闭标签,标记语言(markup language)的身份标志

回头看第一个例子就很简单了,最外层的( )为ArrayCollection的构造函数传递参数,ArrayCollection构造函数的参数为Array数组,这就是[ ]的作用,而该参数数组则包含由{ }实例化的两个对象。

备忘

Apache 2.2, PHP5 环境下,Firefox 3 通过 input 提交的图片里,jpg 的 MIME 类型为 image/jpeg,png 的为 image/png;而 IE7 提交的,jpg 的为image/pjpeg,png 为image/x-png。其它待考。

IE 什么时候能让人省心点啊。

小样儿,跟我玩狠的

被卓越的到货提示玩了两次了,都是收到邮件后直奔链接,结果仍然是“目前无货”。一般书也就罢了,我可以慢慢等,但周老亲笔签名盖章的《红楼梦新证》可是买一本少一本了。看下面评论,有人两分钟后赶到都没了,觉得提示邮件完全不可靠,还是自己想办法,化主动为被动吧。

于是花半个下午写了一个gm脚本,作用是每分钟刷新一次网页,如果有货了就弹出窗口提示。只要上网就把那个页面开着,看谁耗得过谁。

用js刷新完成这个功能属于比较低级的,还得一直开着页面,而且浏览器渲染页面也需要不少时间,时间就是速度啊。更好的办法是用js或动态语言提交http请求,然后直接在服务器返回值中搜索“现在有货”四个关键字,不用渲染,不用DOM,速度应该能提升不少,而且还可以多个同时查询(多个标签页同时刷新时性能肯定不好,浏览器反应慢)改天有空再写一个试试。当然网站肯定是不欢迎这种程序查询的,太多太密的请求对服务器的性能是个考验。不过我一分钟一次请求完全是在正常使用范围以内吧,要不要改成一分钟两次或三次呢。

代码目前就不公布了,等我抢到了那本书再说,其实也很简单,分析一下joyo图书页面的DOM结构就行了。

我的Firefox扩展 v3.0

很久以前写过一篇我的Firefox扩展,过去这么久,fx 3都用了好几个月了,扩展也换了不少,于是决定再写一篇。

我的系统环境是 WinXP En + Firefox 3.0.4 En,公司的电脑装Linux不太好,虚拟机又不是很方便,所以都很久没用Linux了。

扩展如下:

Adblock Plus 0.7.5.5
All-in-One Sidebar 0.7.6
Delicious Bookmarks 2.0.104
Extended Copy Menu 1.5
Firebug 1.2.1
Firefox Universal Uploader (fireuploader) 0.3.8 [DISABLED]
FireFTP 1.0.2
FireGestures 1.1.5.1
FireShot 0.61 [DISABLED]
Forecastfox 0.9.7.7
FoxyProxy 2.8.9 [DISABLED]
FxIF 0.2.3
gladder 2.0.3.1
Gmail Manager 0.5.5
Gmail Space 0.5.97 [DISABLED]
Google Reader Watcher 0.0.13.2
Greasemonkey 0.8.20080609.0
IE Tab 1.5.20080823
Locationbar² 1.0.3
MediaWrap 0.1.7.3
Nightly Tester Tools 2.0.2
QuickDrag 1.0.5
ScribeFire 3.1.4
StumbleUpon 3.26 [DISABLED]
Tab Mix Lite CE 3.0
Tab Scope 0.2.2.8
Ubiquity 0.1.2
Web Developer 1.1.6

逐一介绍如下,我认为重要的扩展用粗体标出:

Adblock Plus: 广告拦截利器,支持白名单和黑名单,还支持拦截规则订阅和更新,几乎人手一套。

All-in-One Sidebar: 侧边栏扩展,把书签,历史记录,add-on管理都放到可自动隐藏的侧边栏。

Delicious Bookmarks: 针对del.icio.us的扩展,有提交和管理书签等功能,del.icio.us用户推荐使用。

Extended Copy Menu: 复制网页上文字时清除格式和链接,只留下纯文本。

Firebug: 网页开发利器,功能多多,如DOM查看,request,response查看,JavaScript调试等,很久没写网页,都闲置了。

Firefox Universal Uploader (fireuploader): 上传到flickr, picasa等,由于Picasa软件的管理和上传很好用,就禁用了。

FireFTP: 把Firefox变成FTP客户端,很好用的扩展,我都基本不用FileZilla了。

FireGestures: 鼠标手势,实用的扩展,可自定义,本来一直用的是All in One Gestures,但这个率先支持fx 3,所以就选它了,功能都差不多。

FireShot: 网页截图工具,感觉功能一般,而且用得不多,就禁用了。

Forecastfox: 天气预报扩展,用的是accuweather.com的数据,准确性不错,可自定义城市,天数,显示方式等,并支持多个配置文件。

FoxyProxy: 强大的代理服务器配置及管理扩展,我用代理服务器的时候不多,主要也就是翻墙的时候,感觉gladder更简单好用,所以就禁了。

FxIF: 查看照片的Exif信息。

gladder: 利用网页代理翻墙的好工具。

Gmail Manager: gmail用户必备,定时检查gmail,有新邮件时会提醒,支持多个账户。

Gmail Space: 把gmail变成网络存储空间,对大文件会分卷压缩,充分利用那6G+的空间。

Google Reader Watcher: Google Reader条目数量检查,嗯,其实我主要是为了有个按钮可以快速地点进Google Reader.

Greasemonkey: 超强扩展,利用JS在本地改变网页,可以针对特定站点设置,Userscripts.org上有大量可用脚本,有所有网页通用的,也有针对Google,del.icio.us,YouTube等特定站点的,豆瓣也有不少脚本。

IE Tab: 让人无奈的扩展,调用IE内核打开当前标签页,可针对特定站点设置,不支持Firefox的网页就用它好了,只希望有一天这个扩展仅用于网页调试的用途。

Locationbar²: 高亮当前网页的域名,对当前网址进行分段式显示并链接,在FTP结构式的网页中跳转很方便。

MediaWrap: 同样是令人无奈的扩展,有些网站嵌入的流媒体不支持Firefox(代码写法问题),可用这个扩展使其兼容。

Nightly Tester Tools: 顾名思义,对使用nightly版本测试的人很管用,尤其是新的Firefox版本刚发布而扩展还没更新时,可以强制使扩展兼容,很多扩展即可继续使用。还有导出扩展列表的功能,上面的扩展名单就是用它导出的。

QuickDrag: 超级拖曳,之前一直用的SuperDragandGo没找到3.0兼容的版本,DragdeGo又太复杂了,就用了这个扩展。

ScribeFire: 离线blog发布工具,支持blogger, MSN Space等BSP及WordPress,MT等自建blog程序。

StumbleUpon: 针对stumbleupon.com的扩展,StumbleUpon是一个网页推荐,分享的网站,根据你的浏览历史和喜好来推荐网站,用来kill time很不错。

Tab Mix Lite CE: tab类扩展,扩充fx标签页的功能,类似的还有Tab Mix Plus等。

Tab Scope: 类似于Opera的标签页预览功能,鼠标指向其他标签页时会弹出网页缩略图,也可以进行前进,后退,刷新,关闭等操作。

Ubiquity: 好玩的扩展,尚处于开发阶段,命令行用户的最爱,对普通用户也很实用,通过命令调用网站的API完成某些操作而不用到那个网站上去了。

Web Developer: 同样是网页开发利器,功能多多,可标记div等元素,调试CSS时尤其好用,因为是实时生效的。

以上所有扩展都可以在Firefox扩展的官网上找到,个别没有的google一下也能找到了。

帮Firefox创造世界纪录

2008下载日

Firefox 3 发布在即(半年前就开始beta,等得头发都白了),spreadfirefox.com 搞了一个 Firefox 下载日活动,号召大家在 Firefox 3 的正式发布日24小时之内下载,以创造吉尼斯世界纪录。作为使用 fx 已达3 年的 fans,这么有意义的活动当然不能错过。

btw, FX 3 RC2 似乎不如 RC1,不仅很多中文字符显示为乱码,还会内存泄漏,崩溃次数也多了不少,但愿正式版能有所改进。

关于Google的PageRank的一篇翻译

学校要求的,用于毕业的,不少于 5000 字的翻译。多次搜索和挑选,最终选择了这篇 How Google Finds Your Needle in the Web’s Haystack(Google 如何在网络的干草堆中找到你的针)。因为对 Google 的算法感兴趣,跟数学有关,而文中的矩阵运算又不难。由于时间不是很多,后面的比较快,翻译得不怎么好。原文

因为太长,而且很多公式,一个个贴图麻烦,所以这里只有少部分内容,制作了一个全文的 pdf,下载

大多数的搜索引擎,包括 Google,不断地运行着取回来自网络的页面,索引每份文件中的单词,并以一种高效的格式储存这份数据的一支电脑程序的队伍。每当用户使用一个搜索短语,例如“搜索引擎”,请求一次网络搜索,搜索引擎找出网络上含有搜索短语中单词的所有网页。(也许相关的信息,如单词“搜索与“引擎”之间的距离也会被注意到。)现在的问题是:Google现在宣称索引了 250 亿张网页。网页中大概 95% 的文字仅仅由10,000 个单词写作而成。这意味着,对大部分搜索引擎,将会有巨大数量的页面包含搜寻短语中的单词。需要一种根据符合搜索条件的页面的重要性排名的方法,使网页能够按照最重要的页面排在列表的最上面的规则排列。

Google 的 PageRank 算法评定网页重要性时,没有基于内容的人工评估。事实上,Google 觉得它的服务价值很大程度上在于它对搜索查询提供无偏见结果的能力;Google 宣称:“我们软件的核心是 PageRank。”我们将会看到,诀窍是使网络自身根据页面的重要性排名。

谁重要

由 PageRank 的创造者 Sergey Brin 和 Lawrence Page 提出的一个基本想法是:页面的重要性由链接至它的页面数量以及这些页面的重要性决定。我们将会赋予每个网页P一个度量其重要性的 I(P),叫做该页面的 PageRank。

这里是 PageRank 如何产生的。设页面 Pjlj 个链接。如果其中有一个链接指向页面 Pi,则 Pj 会传递它重要性的 1/ljPiPi 的重要性排名则是所有链接接到它的页面贡献值之和。也就是,如果我们用 Bi 表示链接到 Pi 的页面集合,则

sigma pic

这可能会让你想起鸡和蛋:要决定一个页面的重要性,我们需要先知道所有链接到它的页面的重要性。然而,我们可以把这个问题转换为一个更加数学化相似的问题。

……(太多了懒得复制,而且我没有使用所见即所得编辑器,逐个标签地控制格式也是件很麻烦的事,想看全文的请下载 pdf 或到源地址读原文)

Archives

Categories

Tag Cloud

Words