??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美精品九九99久久在观看,久久久久99精品成人片三人毛片 ,久久亚洲av无码精品浪潮http://www.shnenglu.com/chengmeng/category/2398.htmlzh-cnMon, 19 May 2008 17:26:49 GMTMon, 19 May 2008 17:26:49 GMT60g++的一个bug?http://www.shnenglu.com/chengmeng/archive/2006/10/12/13604.htmlchengerchengerThu, 12 Oct 2006 08:28:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/10/12/13604.htmlhttp://www.shnenglu.com/chengmeng/comments/13604.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/10/12/13604.html#Feedback3http://www.shnenglu.com/chengmeng/comments/commentRss/13604.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/13604.html
class A
{
public:
    template
<typename T>
    T f(T val);

    template <>
    int
f<int>(int val);
};

我用的是g++ 3.4.2 mingw版本。编译上面这D代码时Q错误信息如下:

5: error: invalid explicit specialization before '>' token
5: error: explicit specialization in non-namespace scope `class A'

如果把f的定义放到全局作用域中Q就不会出错。而上面这D代码在VC++ 8.0下可以编译通过。运行v来也没有问题。别的编译器我没有试q?br />
UpdateQ多谢周星星的指点,比较“常规”的写法如下:

class A
{
public:
    template <typename T>
    T f(T val);
};


template
<typename T>
T A::f(T val)
{
    // ...
}

template <>
int
A::f<int>(int val)
{
    //...
}


q种写法没有Q何问?在g++ 3.4.2和VC++ 8.0下均表现正常Q。至于ؓ什么前面的写法Dg++下报错,q不是很清楚?img src ="http://www.shnenglu.com/chengmeng/aggbug/13604.html" width = "1" height = "1" />

chenger 2006-10-12 16:28 发表评论
]]>
Exploring Ruby I:Name Conventionshttp://www.shnenglu.com/chengmeng/archive/2006/09/29/13156.htmlchengerchengerFri, 29 Sep 2006 10:56:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/09/29/13156.htmlhttp://www.shnenglu.com/chengmeng/comments/13156.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/09/29/13156.html#Feedback0http://www.shnenglu.com/chengmeng/comments/commentRss/13156.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/13156.html Ruby中的名字U定

历史Q高U程序语a的老祖宗,FortranQ对源程序中的名字,或者叫标识W?identifier)有很严格的规定,譬如首字母代表变量的cd{等。个是当q编译技术还未成熟时的权宜之计。后来主的E序设计语言都放松了对名字的限制Q像C/C++/JavaQ只有一点点小的约束(Ҏ用字W的限制Q只能用英文字母、数字、下划线Q必M下划U或英文字母开头。这也容易理解,完全是ؓ了写词法分析器的方便Q。而和Fortran同时代的LispQ这斚w更是大开l灯Q爱怎么定义怎么定义。然而到了现在,g有点复古的潮,有些语言开始对名字讄一些规则,比如Haskell,Erlang,包括Ruby?br />
a归正传。Ruby中的名字规则主要是根据名字的W一个字母来军_q个名字的用方式。具体来_
  • 局部变量,Ҏ名,Ҏ参数Q以写字母或下划线开_?_'q接?br />ExampleQi,note_controller
  • 帔RQ全部大写,?_'q接
    ExampleQA_NUM
  • c,模块(module)Q都是开头大写(因ؓcd是全局变量Q,其他写q且直接q接在一?br />ExampleQActiveRecord
  • 全局变量Q以'$'开_肯定是跟Perl学的Q我觉得不怎么好)
  • 实例变量(instance variable)Q以'@'开_同上Q?/li>
  • cd?class variable)Q以'@@'开_诡异Q?/li>
有点Perl的味道,但Perl更加变态,居然要以首字母区分标量、数l和Hash表,q就不太人道了。相比v来,Ruby的设|还是可以接受的Q它只不q是把有些约定俗成的规则直接变成了语a规则。每个程序员基本上都会有自己的一套命名规则,比如写C++E序Ӟcd通常用大写字母开_宏名则通常由大写字母组成,而下划线开头的Q特别是双下划线Q往往留给库开发者等{。Ruby的想法可能是Q干脆统一了这些命名规则,免得ZU风?Style)问题争论不休。也是挺有道理的?img src ="http://www.shnenglu.com/chengmeng/aggbug/13156.html" width = "1" height = "1" />

chenger 2006-09-29 18:56 发表评论
]]>
玩了玩Rubyhttp://www.shnenglu.com/chengmeng/archive/2006/09/24/12878.htmlchengerchengerSun, 24 Sep 2006 06:50:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/09/24/12878.htmlhttp://www.shnenglu.com/chengmeng/comments/12878.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/09/24/12878.html#Feedback0http://www.shnenglu.com/chengmeng/comments/commentRss/12878.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/12878.html
Ruby的源代码q充分体C拿来M的精,能重用的决不自己写:比如Hash表就用了一个通用的Hash表实玎ͼ正则表达式则使用了GNU的regex库,random是有名的MT19937Q也是日本h写的Q。尝试了一下编译,在mingw上执行标准三部曲Q?/configure,make,make installQ一切OK?br />


chenger 2006-09-24 14:50 发表评论
]]>
Google面试题之补充http://www.shnenglu.com/chengmeng/archive/2006/09/16/12548.htmlchengerchengerSat, 16 Sep 2006 07:35:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/09/16/12548.htmlhttp://www.shnenglu.com/chengmeng/comments/12548.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/09/16/12548.html#Feedback4http://www.shnenglu.com/chengmeng/comments/commentRss/12548.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/12548.html文章。我l的法跑得很慢Q后面张沈鹏同学用python写了一?a href="/zuroc/archive/2006/09/16/12540.html">法Q速度很快Q再ơ感觉python的性能不像惌中那么坏Q当然和法有关Q,看了一下他的代码,函数count(i)用来计算于i?的个敎ͼ和我写的calc_ones法基本相同Q只不过count(i)用了递归Q看上去更清楚一些。主要的速度差别在little(i)函数上,q个函数避免了很多P代:

size_t little(size_t i)
{

   
size_t ones = calc_ones(i);
    if(ones == i)
        cout << i <<
"\n";
    if(i < ones)
        if
((ones - i)/9 > 1)
            return
i - (ones - i)/8;
    if
(i > ones)
        return
ones;
    return
i - 1;
}


q是C++版本。主循环也要略微改变一下:

void
solve()
{

    size_t
max = 10000000000;
    for
(size_t i = max;i > 0;i = little(i));
}


可以看到Q现在@环从大到。little函数扑ֈ下一个可能满题目约束的i。在little函数中,首先计算于i?的个数onesQ如果ones和i相等Q就i输出Q这是题目要求q的事)。如果i于onesQ那么就要在于i的自然数中找下一个可能满x件的数。因为搜索的范围不超q?0^10Q所以一个数中至多含??Q按照这U极端情况,也必di减少(ones-i)/8才有可能满条g(q里之所以是8Q因为同时i也减了Q。如果i大于onesQ考虑一个小于i的数i'Q可以考虑一下calc_ones(i')的取|极端情况Q[i',i)的范围内的整数没有一个包?Q也是说当i减少到i'?的个数没有损失,那么calc_ones(i') = calc_ones(i)Q如果i'>calc_ones(i)Q则有i'>calc_ones(i')Q直到i'=calc_ones(i)Q因此下一个需要查看的数就是calc_ones(i)。其实上面这一D讨论可以用一个式子来概括Q对i'<i,calc_ones(i)-9*(i-i') <= calc_ones(i') <= calc_ones(i)。这样就能大大提高速度了?br />

chenger 2006-09-16 15:35 发表评论
]]>
回溯法求解素数填表问?/title><link>http://www.shnenglu.com/chengmeng/archive/2006/09/13/12425.html</link><dc:creator>chenger</dc:creator><author>chenger</author><pubDate>Wed, 13 Sep 2006 15:13:00 GMT</pubDate><guid>http://www.shnenglu.com/chengmeng/archive/2006/09/13/12425.html</guid><wfw:comment>http://www.shnenglu.com/chengmeng/comments/12425.html</wfw:comment><comments>http://www.shnenglu.com/chengmeng/archive/2006/09/13/12425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/chengmeng/comments/commentRss/12425.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/chengmeng/services/trackbacks/12425.html</trackback:ping><description><![CDATA[     摘要: 问题是这LQ?*3的方|填入1-10Q比10更大也可以)Q要求相MC和ؓ素数?q个题目除了回溯g没有别的Ҏ了?nbsp; <a href='http://www.shnenglu.com/chengmeng/archive/2006/09/13/12425.html'>阅读全文</a><img src ="http://www.shnenglu.com/chengmeng/aggbug/12425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/chengmeng/" target="_blank">chenger</a> 2006-09-13 23:13 <a href="http://www.shnenglu.com/chengmeng/archive/2006/09/13/12425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个语al节问题http://www.shnenglu.com/chengmeng/archive/2006/09/11/12297.htmlchengerchengerMon, 11 Sep 2006 11:01:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/09/11/12297.htmlhttp://www.shnenglu.com/chengmeng/comments/12297.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/09/11/12297.html#Feedback3http://www.shnenglu.com/chengmeng/comments/commentRss/12297.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/12297.html阅读全文

chenger 2006-09-11 19:01 发表评论
]]>
据说是Google面试?/title><link>http://www.shnenglu.com/chengmeng/archive/2006/09/08/12161.html</link><dc:creator>chenger</dc:creator><author>chenger</author><pubDate>Fri, 08 Sep 2006 05:05:00 GMT</pubDate><guid>http://www.shnenglu.com/chengmeng/archive/2006/09/08/12161.html</guid><wfw:comment>http://www.shnenglu.com/chengmeng/comments/12161.html</wfw:comment><comments>http://www.shnenglu.com/chengmeng/archive/2006/09/08/12161.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.shnenglu.com/chengmeng/comments/commentRss/12161.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/chengmeng/services/trackbacks/12161.html</trackback:ping><description><![CDATA[从同学那儿听说了一个传说是Google面试题的题目Q找出所有的正整数NQ得小于N的所有正整数的各位数字中所有的'1'的数目和N相等?br /><br />我的解法Q?br /><br /><font color="#a020f0" face="Courier New">#include </font><font color="#ff00ff" face="Courier New"><iostream></font><font face="Courier New"></font><font color="#a020f0" face="Courier New"><br />#include </font><font color="#ff00ff" face="Courier New"><limits></font><font face="Courier New"></font><font color="#a020f0" face="Courier New"><br />#include </font><font color="#ff00ff" face="Courier New"><cstddef></font><font face="Courier New"></font><font color="#804040" face="Courier New"><b><br /><br />using</b></font><font color="#2e8b57" face="Courier New"><b> namespace</b></font><font face="Courier New"> std; <br /><br /></font><font color="#2e8b57" face="Courier New"><b>size_t</b></font><font face="Courier New"> calc_ones(</font><font color="#2e8b57" face="Courier New"><b>size_t</b></font><font face="Courier New"> n) <br />{ </font><font color="#2e8b57" face="Courier New"><b><br />    const </b></font><font color="#2e8b57" face="Courier New"><b>size_t</b></font><font face="Courier New"> save = n; <br /></font><font color="#2e8b57" face="Courier New"><b>    size_t</b></font><font face="Courier New"> sum = </font><font color="#ff00ff" face="Courier New">0</font><font face="Courier New">,ten = </font><font color="#ff00ff" face="Courier New">1</font><font face="Courier New">,cnt = </font><font color="#ff00ff" face="Courier New">1</font><font face="Courier New">; <br /></font><font color="#804040" face="Courier New"><b>    if</b></font><font face="Courier New">(n%</font><font color="#ff00ff" face="Courier New">10</font><font face="Courier New"> > </font><font color="#ff00ff" face="Courier New">1</font><font face="Courier New">) <br />        sum = </font><font color="#ff00ff" face="Courier New">1</font><font face="Courier New">; <br />    n /= </font><font color="#ff00ff" face="Courier New">10</font><font face="Courier New">; </font><font color="#804040" face="Courier New"><b><br />    for</b></font><font face="Courier New">(;n;n /= </font><font color="#ff00ff" face="Courier New">10</font><font face="Courier New">) <br />    { </font><font color="#2e8b57" face="Courier New"><b><br />        size_t</b></font><font face="Courier New"> r = n%</font><font color="#ff00ff" face="Courier New">10</font><font face="Courier New">; </font><font color="#804040" face="Courier New"><b><br />        if</b></font><font face="Courier New">(r == </font><font color="#ff00ff" face="Courier New">1</font><font face="Courier New">) <br />            sum += save + (r*cnt - </font><font color="#ff00ff" face="Courier New">10</font><font face="Courier New">*n)*ten; <br /></font><font color="#804040" face="Courier New"><b>        else</b></font><font color="#804040" face="Courier New"><b> if</b></font><font face="Courier New">(r != </font><font color="#ff00ff" face="Courier New">0</font><font face="Courier New">) <br />            sum += (</font><font color="#ff00ff" face="Courier New">10</font><font face="Courier New"> + r*cnt)*ten; <br />        ten *= </font><font color="#ff00ff" face="Courier New">10</font><font face="Courier New">; <br />        ++cnt; <br />    } <br /></font><font color="#804040" face="Courier New"><b>    return</b></font><font face="Courier New"> sum; <br />} <br /><br /></font><font color="#2e8b57" face="Courier New"><b>void</b></font><font face="Courier New"> solve() <br />{ </font><font color="#2e8b57" face="Courier New"><b><br />    size_t</b></font><font face="Courier New"> max = numeric_limits<</font><font color="#2e8b57" face="Courier New"><b>size_t</b></font><font face="Courier New">>::max(); </font><font color="#804040" face="Courier New"><b><br />    for</b></font><font face="Courier New">(</font><font color="#2e8b57" face="Courier New"><b>size_t</b></font><font face="Courier New"> i = </font><font color="#ff00ff" face="Courier New">1</font><font face="Courier New">;i < max;++i) </font><font color="#804040" face="Courier New"><b><br />        if</b></font><font face="Courier New">(calc_ones(i) == i) <br />            cout << i << </font><font color="#ff00ff" face="Courier New">"</font><font color="#6a5acd" face="Courier New">\n</font><font color="#ff00ff" face="Courier New">"</font><font face="Courier New">; <br />} </font><font color="#2e8b57" face="Courier New"><b><br /><br />int</b></font><font face="Courier New"> main() <br />{ <br />    solve(); </font><font color="#804040" face="Courier New"><b><br />    return</b></font><font color="#ff00ff" face="Courier New"> 0</font><font face="Courier New">; <br />}</font><br /><br />在VS2005下编译运行,输出l果为:<br /><br />199992 199993 199994 199995 199996 199997 199998 199999 200000 1599992 1599993 1599994 1599995 1599996 1599997 1599998 1599999 1600000 1600001 2600000 13200000 13200001 35000000 35199992 35199993 35199994 35199995 35199996 35199997 35199998 35199999 35200000 117463827 500000000 500199992 500199993 500199994 500199995 500199996 500199997 500199998 500199999 500200000 501599992 501599993 501599994 501599995 501599996 501599997 501599998 501599999 501600000 501600001 502600000 513200000 513200001 535000000 535199992 535199993 535199994 535199995 535199996 535199997 535199998 535199999 535200000<br /><br />可以证明Q再往上就没有了。跑得比较慢Q需要好几分钟。我考虑q进一步羃检索的范围Q应该是可以做到的,不过没有实现?br /><br />UpdateQ上面的法有很大的改进余地Q主要来自张沈鹏同学l出的程序,我专门写了一文章来讨论Q?a href="/chengmeng/archive/2006/09/16/12548.html">q里</a>。或者可以直接看<a href="/zuroc/archive/2006/09/16/12540.html">张沈鹏同学的文章</a>?br /><img src ="http://www.shnenglu.com/chengmeng/aggbug/12161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/chengmeng/" target="_blank">chenger</a> 2006-09-08 13:05 <a href="http://www.shnenglu.com/chengmeng/archive/2006/09/08/12161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Return of Turboshttp://www.shnenglu.com/chengmeng/archive/2006/09/06/12070.htmlchengerchengerTue, 05 Sep 2006 23:32:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/09/06/12070.htmlhttp://www.shnenglu.com/chengmeng/comments/12070.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/09/06/12070.html#Feedback7http://www.shnenglu.com/chengmeng/comments/commentRss/12070.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/12070.html
Turbo下蝲

UpdateQ说一下下载文件的情况。有两个部分Q一个是prerequisitesQ另一个是main installation。奇怪的是prerequisites当中q包?NET Framework 1.1Q是不是太old了一点?q部分prerequisites和Borland Develop Studio基本上是一L?br />
l箋UpdateQ很不幸Q未能成功。安装了一遍之后,启动时接q保错,g是在drtl100.bpl和coreide100.bpl的时候出了段错误Q结果IDE是启动了Q和C++有关的项目还有组件一个都没有……虽然还剩了诸如~译器和~辑器调试器{内容,但意义不大。考虑到机子上原来q装了个C++ Builder 6Q卸之,再重装一遍Turbo C++Q还是老样子……彻底放弃?br />

chenger 2006-09-06 07:32 发表评论
]]>
临时对象的生存期http://www.shnenglu.com/chengmeng/archive/2006/09/04/12024.htmlchengerchengerMon, 04 Sep 2006 15:23:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/09/04/12024.htmlhttp://www.shnenglu.com/chengmeng/comments/12024.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/09/04/12024.html#Feedback13http://www.shnenglu.com/chengmeng/comments/commentRss/12024.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/12024.html发现了VS 2005的一个重量Bug!

q是直接l出代码Q?br />
#include <iostream>
#include
<string>

using
namespace std;

int
main()
{

    const
char *p = string("hello").c_str();
    cout << p << endl;

    return
0;
}


x输出l果是什么?

q时VS2005和g++的结果就不一样了。VS2005上什么都不输出,而g++ 3.4上则输出了似乎非常合理的l果QhelloQ符合很多h的预期。不q查了标准以后,q是把票投给VS2005?br />
首先Q?font face="Courier New">string("hello")产生了一个temporary objectQ或者说临时对象。C++标准对时对象的生存?life time)有明的规定Q可见标?2.2节第3-5条。第3条讨Z临时对象的析构时_

3. ... Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception.

q又涉及到full-expression的定义了Q参?.9节。整个对p的初始化构成了一个full-expression。在下结Z前,q要先看看第4?条,分别讨论了两个例外情形,一个是时对象作为初始化子,例如string s = string("hello")Q第二是一个引用变量绑定到q个临时对象上,例如const string &s = string("hello")Q总而言之,在这两种情Ş中可以通过一个名字来存取q个对象Q此对象的生存期g长到变量名的作用域结束。除此之外,都按照第3条处理?br />
有了q些准备Q拿前面l的例子往里套明白了Q这里没有出??所指出的例外,因此W?条的原则适用。而不full-expression如何Q可以确定的是在p被初始化之后临时对象string("hello")的析构函数就应该被调用。在VS2005中进行调试,可以发现string析构函数调用的时间就在p被初始化之后Q语?font face="Courier New">cout << p << endl执行之前。手头没有方便的工具来调试g++~译出来的程?不太会用gdb调试C++E序Q特别涉及到STL)。至于之后p指向的内存到底如何,则和具体的string实现相关了。这样分析下来,VS2005的结果还是比较不错的Q而g++的结果则Ҏ让h产生误解?br />
UpdateQ察看g++~译出来的汇~代码,发现g++同样在表辑ּ求值后析构了时对象,只不q由于实C的原因,p指向的内容还没有清空?img src ="http://www.shnenglu.com/chengmeng/aggbug/12024.html" width = "1" height = "1" />

chenger 2006-09-04 23:23 发表评论
]]>
{法的性能试http://www.shnenglu.com/chengmeng/archive/2006/09/02/11972.htmlchengerchengerSat, 02 Sep 2006 13:16:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/09/02/11972.htmlhttp://www.shnenglu.com/chengmeng/comments/11972.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/09/02/11972.html#Feedback0http://www.shnenglu.com/chengmeng/comments/commentRss/11972.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/11972.htmlq篇blogH然惛_的。这个筛法求素数的程序想必每个学~程的h都写q,几乎是最l典的算法之一了,虽然g没什么用。但好像的确没见q对q个古老算法的严格分析。一时好奇,想把这个算法纳入大O的框架之中……不怎么P先拿Z码再?

require'benchmark'
 
def
sievePerformance(n)
    r =
Benchmark.realtime() do
        sieve =
Array.new(n,true)
        sieve[
0..1] = [false,false]
        2.upto(n) do |i|
            if sieve[i]
                (
2*i).step(n,i) do |j|
                    sieve[j] =
false
               
end
           
end
       
end
    end

   
r
end


q段代码抄自前面Robert C.Martin先生的blogQ对{法作性能试。初看v来,E序的主体是二重循环Q因此算法的复杂性好像是O(N2)之类的玩意?要么是O(NlnN)Q?br /> 
下图是Ruby自带的benchmark模块量的结果,上限N?0000?00000Q步?0000。Rober C.Martin的文章里也有一张图Q是?000000?000000Q从图中可以看到Q他电脑的性能q胜于我Q我要是?000000?000000q么跑一遍,花儿都谢了……MQ实的l果是:q个法的性能基本上是U性的。出于对rubyq样的解释型语言的某U不信QQ我又把q段E序用C++重写了一遍,拿C标准库提供的clock函数量旉Q结果在N于10000000的时候,基本上呈U性,但再往后花费的旉开始超q线性增长了?br />
下面我给一个比较粗略的分析Q解释ؓ什么这个算法的复杂度表CؓU性。首先,我认Z要花Ҏ间的是对sieve数组的读写,循环变量的增加应该可以忽略。如果p<N是素敎ͼ那么pq入内@环将i的倍数“挖掉”,也就是对sieve的相应元素赋|要进行[N/p]-1ơ。这样就得到d的赋值次数S为:



其中p为素数。显?br />


数论中有个Mertens定理可以估计上面括号中的和式Q结果ؓ



其中c是一个常数。可以看刎ͼ在N很大时和式的主要部分为NlnlnN。而lnlnN是一个增长极慢的函数Qlnln105=2.44Qlnln109=2.91Q几乎就可以当常数处理(臛_?2位无W号整数范围内)。其他的一些项Q比如@环变量的步进Q都是O(N)Q这也就不难理解整个E序的性能是几乎是O(N)了?br />



UpdateQ上面的代码有个很明昄问题Q就是内循环应该从i*i开始,而不?*iQ这样对于比较大的NQ性能提高很明显(接近一半)。另外一个可改进的地Ҏ外层循环的upto(n)Q可以改为upto(Integer(Math.sqrt(n))Q其实这两个改动效果是重叠的QQ意改一个就差不多了。赋值次数S应ؓQ?br />


l果为:



可以看到效率的提升是很明昄Q毕竟lnln232也才不到3.1Qln2Uؓ0.7?br />

chenger 2006-09-02 21:16 发表评论
]]>
Sort algorithm in Haskellhttp://www.shnenglu.com/chengmeng/archive/2006/08/18/11424.htmlchengerchengerFri, 18 Aug 2006 14:20:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/08/18/11424.htmlhttp://www.shnenglu.com/chengmeng/comments/11424.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/08/18/11424.html#Feedback2http://www.shnenglu.com/chengmeng/comments/commentRss/11424.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/11424.html
用Haskell写了两个排序法Q快速排序和合ƈ排序。都很短Q没几行E序Q虽然效率肯定是不敢恭维的,但能用来满我们那自ƺ欺人的感Q言意赅不是很高的境界么Q不是写文章还是写E序都差不多。但同时要清楚,要可L。说了这么多q是看看成果吧:

module Sort where

-- Quick Sort Algorithm

quicksort [] = []
quicksort (x
:xs) = quicksort [y | y <- xs,y <= x]
++ [x] ++ quicksort [y | y <- xs,y > x]

-- Merge two ordered sequences
merge' [] [] = []
merge' lst []
= lst
merge' [] lst
= lst
merge' (x1
:xs1) (x2:xs2) =
if
x1 < x2
then x1:(merge' xs1 (x2:xs2))
else x2:(merge' (x1:xs1) xs2)

-- Merge Sort Algorithm
mergesort [] = []
mergesort (x
:[]) = [x]
mergesort lst
=
let
parts = splitAt (div (length lst) 2) lst
in merge' (mergesort (fst parts))
(mergesort (snd parts))



其实只利用了递归和Haskell强大的列表处理功能。这也不是Haskell的专利,我相信Python或Ruby或Lisp也完全能做到?img src ="http://www.shnenglu.com/chengmeng/aggbug/11424.html" width = "1" height = "1" />

chenger 2006-08-18 22:20 发表评论
]]>
快要崩溃了……写个程序玩?/title><link>http://www.shnenglu.com/chengmeng/archive/2006/08/16/11268.html</link><dc:creator>chenger</dc:creator><author>chenger</author><pubDate>Wed, 16 Aug 2006 01:03:00 GMT</pubDate><guid>http://www.shnenglu.com/chengmeng/archive/2006/08/16/11268.html</guid><wfw:comment>http://www.shnenglu.com/chengmeng/comments/11268.html</wfw:comment><comments>http://www.shnenglu.com/chengmeng/archive/2006/08/16/11268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/chengmeng/comments/commentRss/11268.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/chengmeng/services/trackbacks/11268.html</trackback:ping><description><![CDATA[被GRE作文弄得快要心理变态,严重的不自信。特此用Haskell写一个小E序Q主题还是永恒的求素? <br /><br /><pre><font color="#2e8b57" face="Courier New"><b>module</b></font><font face="Courier New"> Prime </font><font color="#2e8b57" face="Courier New"><b>where</b></font><br />prime<font><font face="Courier New">'</font></font> [] <font color="#804040" face="Courier New"><b>=</b></font><font face="Courier New"> []<br />prime' (x</font><font color="#804040" face="Courier New"><b>:</b></font><font face="Courier New">xs) </font><font color="#804040" face="Courier New"><b>=</b></font> x<font color="#804040" face="Courier New"><b>:</b></font><font face="Courier New">(prime' (filter (</font><font color="#804040" face="Courier New"><b>\</b></font><font face="Courier New">y </font><font color="#804040" face="Courier New"><b>-></b></font><font face="Courier New"> (mod y x)</font><font color="#804040" face="Courier New"><b>/=</b></font><font color="#ff00ff" face="Courier New">0</font><font face="Courier New">) xs))<br />prime n </font><font color="#804040" face="Courier New"><b>=</b></font><br /> prime<font><font face="Courier New">'</font></font> [<font color="#ff00ff" face="Courier New">2</font><font face="Courier New"></font><font color="#804040" face="Courier New"><b>..</b></font><font face="Courier New"> n]</font><br /></pre><br /> 呵呵Q相当的z明了,有点<font face="Courier New">functional</font>的味道了。说hq个E序是颇能体现“筛法”的Q毕?font face="Courier New">filter</font>是一个筛子。搞了半天,好像都在自夸Q不知道有没有更好的写法?br /><img src ="http://www.shnenglu.com/chengmeng/aggbug/11268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/chengmeng/" target="_blank">chenger</a> 2006-08-16 09:03 <a href="http://www.shnenglu.com/chengmeng/archive/2006/08/16/11268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Regular Expression判定素数http://www.shnenglu.com/chengmeng/archive/2006/08/08/10972.htmlchengerchengerTue, 08 Aug 2006 04:03:00 GMThttp://www.shnenglu.com/chengmeng/archive/2006/08/08/10972.htmlhttp://www.shnenglu.com/chengmeng/comments/10972.htmlhttp://www.shnenglu.com/chengmeng/archive/2006/08/08/10972.html#Feedback0http://www.shnenglu.com/chengmeng/comments/commentRss/10972.htmlhttp://www.shnenglu.com/chengmeng/services/trackbacks/10972.html
sub is_prime {
    my ($number) = @_;
    return (1 x $number) !~ m/\A (?: 1? | (11+?)(?> \1+)) \Z/xms;
}

是不是有点匪h思?堪称Perl中的混ؕ代码(Obfuscated Code)。所以正则表辑ּq个玩意Q用得好了不_巨强大无比,可是晦ӆh也不输于机器码。我现在对Perl了解不多Q上面这行正则表辑ּp我郁闷了很久Q刚看到p了:?:?>是什么东西?赶紧dProgramming Perl看,原来是Perl的Extented Regular Expression……恶补了一阵之后回头来琢磨Q终于大致明白其中的道理?br />
原理其实很简单,是最原始的方法:如果要决定正整数N是不是素敎ͼ拿于N的正整数(?开?挨个去除Q如果发现除则表明是合数。当Ӟ0?要特D处理,他们两个都不是素敎ͼ前面正则表达式中??是Zq个目的。?11+?)(?> \1+)开始了循环验的q程。这其中的过E很有意思,最好是拿Perl的re模块来debug一下,只要在文件开头加上use re"debug"成了,执行时会详细的输出整个匹配的q程。我们现在就来跟t一下,在匹配时到底发生了什么好玩的事情?br />
(1 x $number)创徏了一个长度ؓ$numberQ全部由'1'l成的串。首先,(11+?)可以匚w长度不小?的全?1'l成的字W串。假如我们拿"1111"d配,那么首先(11+?)会匹配整个串Qƈ这部分匚w到的内容保存在\1中。然后往下走Q这时第二部分的要求不能满了—??> \1+)。暂且不?>是什么意思,q个表达式的要求是前面匚w到的部分重复出现一ơ以?看到q里可能已经有h明白了,q不是整除么?变态整除!)Q但是目前的匚w不满求:整个串都匚w光了Q只剩下一个\Z了。所以我们唯物主义的正则表达式引擎会backtracing(回溯)Q往回退一步,?11+?)只匹?111"Q但q样q是不行Q只好再往回退Q这时你发现Q\1中的内容?11"Q剩下的部分也是"11"Q匹配成功了。其实这只是4=2*2的另一U说法。注意到函数中的匚wq算W是!~Q整个函数返?。如果一直回退到最?"11")q是匚w不了Q说?number是一个素数?br />
说到q里Q作者的巧思确实值得佩服Q虽然看I了会觉得不q如此。然后还有两个问题没有解冻I是?>?:到底是干什么吃的??>的意思是No backtracing,?:则是Cluster but no grouping?>可以不要Q不影响l果(可能Ҏ率有些媄响,但相信没有h会拿q种办法d定素性的)Q但?:׃可缺了?/font>



chenger 2006-08-08 12:03 发表评论
]]>
޾Ʒþþþþò| þþþ99ƷƬԿ| ޾þþþþAV| ھƷþþþþþþõӰ | þþþòҰ¸߳| þۺ³³| ŷ޷avþò| Ʒ18þþ⺾| ľþۺĻ| ڵСþþþþþ| þþƷh| Ʒþþþþ벻| 69Ʒþþþ777| ޹ƷAVþۺӰԺ | þþҹƷ| 69þþƷһ| ϵרþ| þùŷպƷ| ޹պŷۺϾþ| Ʒһþ㽶߿ۿ| þˬˬˬav| þw5www| þѿaëƬ| þþþþྫƷֱ| ޾Ʒھþ| þþƷձҰ| þƵ6| ձþ| þ޾ƷƵ| ձþ| þþþƷҹѲ| þ޾ƷĻ| þþþþϸApp| þþþþAŷAV| ƷþþþþþþþĻ | þAAAAƬһ| 91þþþþþ| ձƷþþþĻ| ƷŮٸaѾþ| 91Ʒþþþþ| 99þ777ɫ|