显示标签为“skill”的博文。显示所有博文
显示标签为“skill”的博文。显示所有博文

Ruby 实现 Eratosthenes筛法求素数 (性能相当于用定义求素数的C实现)

RubyInline, Making Making Things Faster Easier这篇文章用求素数这个例子来介绍用RubyInline在Ruby中混入C代码来提高性能.
然而"For Performance, Write it in C"只是选择之一,适当的选择算法有时来得更简单直接.
下面我用Eratosthenes筛法求素数的Ruby实现计算10000以内的素数,同样达到了上边引文里的0.X秒的性能.
如果用C来实现这个筛法,用链表而不是数组,性能可能还会提升很多.不过用上了Ruby就不会想回头了...


# 用Eratosthenes(埃拉托色尼,公元前三世纪的希腊天文学家、数学家和地理学家)筛
# 法求素数:创建一个数组,以下面的方式将某些位置以空标记:从位置2开始,将所有2的倍数
# 的位置标记为空,然后对2之后的素数3进行同样的操作这样就可以找到3之后未被标记的5,
# 然后再将所有5的倍数记空,如此重复便可以找到数组中的所有素数。
# Sieve of Eratosthenes prime numbers Ruby 实现
def sieve(n)
r=1..n # 得到数列
a=r.to_a # 将数列转化为数组
c=0
i=0 # 数组下标从0开始,i+1对应数组成员2为素数
(1..n).each do # 遍历整个数组
if a[i+=1]!=nil # i+1号数组成员如果没被当作合数划掉,执行下面的处理,同时移动数组下标指向下一个成员
print "#{a[i]}," ;c+=1# 打印这个素数
k=2 # 初始倍数
while a[i]*k <= n # 当素数的倍数小于既定范围时
# a[(i+1)*k-1]=nil # 相应的素数的整数倍合数被从数组中划去,对应数组成员标记为空
# a.delete(a[i]*k) # 直接删去素数的倍数.执行性能差.
a[a[i]*k-1]=nil # 相应的素数的整数倍合数被从数组中划去,对应数组成员标记为空
k+=1 # 加大倍数
end
end
end
puts "以上是#{n}以内的素数.共#{c}个."
end

puts"输入n"
n=gets.to_i # 得到求值范围
if __FILE__ == $0
t1 = Time.now
sieve(n)
print t2 = Time.now - t1 ,"秒内完成"
end


-----------------------
07-4-16 edit
-----------------------
在 http://bohnsack.com/2006/02/13/cs-442-project-1-sieve-of-eratosthenes/ 里看到的:

max = Integer(ARGV.shift || 10000)

sieve = [nil, nil] + (2 .. max).to_a

(2 .. Math.sqrt(max)).each do |i|
next unless sieve[i]
(i*i).step(max, i) do |j|
sieve[j] = nil
end
end

puts sieve.compact.join(", ")

10000内素数0.0X秒内就算出来了.

[zt]我的硬盘我做主----找回失去的硬盘空间

上次简单翻译了 简单五步回收你的Mac硬盘空间, 现在再转一篇文章,里边提到另一些回收Mac硬盘空间的方法。

我的硬盘我做主:----找回失去的硬盘空间(form:http://www.macx.cn/a/a.asp?B=100&ID=266610)

对小白用户来说,捉襟见肘的硬盘空间经常令人头疼。如果你使用的是20或者30G的硬盘,平时1G左右的剩余更是常有的事。刚接触Mac的新手经常会惊讶于迅速消失掉的硬盘空间:明明昨天还有4G的,今天怎么只剩一半了?究竟是哪只看不见的手动了我们的硬盘?
如果你也像狮子一样经常对着“启动磁盘上的空间不足”的警告抓头的话,请follow下面的步骤,保证让这讨厌的警告从此乖乖消失:
首先 清洁小白的屏幕 直到没有任何灰尘为止
然后 擦净鼠标(MM鼠的清洁方式请搜索论坛)
最后 清理键盘 :试试把键盘翻过来晃几晃,看看都会掉出什么来
好了,现在我们开始动手 :

第一步 清空系统日志。

如果你已经用了苹果一年而从来没听说过日志文件的话,恭喜: 你至少能从这上面回收上G的空间。OSX运行的时候会不断的把许多信息写入日志文件,而系统默认是不会自动清理庞大的日志数据的,这东西对我们普通用户也没什么用处,安全删除之!
方法:
A 找到主目录下的 library(资源库)目录,然后是logs子目录,就是它了。全选里面的文件,删除。
B 运行 "应用程序:实用程序:控制台" ,然后选择菜单 "文件=》打开控制台日志" (如图)按苹果+删除键,再选择"文件=》打开系统日志" , 按苹果+删除键。注意是按键盘操作而不是按程序界面上的清除按钮。那个按钮只是清空显示,不会删除文件。

方法B只是删除了体积最大的两个日志文件,不会删除其他小体积文件如应用程序崩溃报告等。所以如果你追求完美请用方法A。

第二步 删除不用的语言包

OS X 对多语言的支持堪称完美,而坏消息是这些语言包会吃掉大量的空间。大部分的程序都内置了我们从来不会用到的多种语言包,白白浪费磁盘。删除不用的语言包大约可以收回2G左右的空间。下面这两个软件都可以帮助你:
DeLocalizer 1.1
Monolingual 1.3.2
http://www.wally.in/soft508.htm

第三步 找出漏网之鱼

对系统文件的清理告一段落,下面我们找一找硬盘里的大体积文件。
打开finder, 按苹果键+F 打开查找功能,设置一个合适的数值(比如5MB)找出你硬盘里所有体积大于这个数的文件。如图:
确定你知道自己要删除的是什么。

另一种方法是(狮子比较偏爱这个)使用Disk Inventory X 这个软件。它的功能非常有趣,会把你硬盘里所有的文件以彩色方格的形式直观显示出来。具体使用方法参考我的另一篇贴子:
Disk Inventory X ---- 透视你的硬盘




第四步 压缩文件

电子书等目录结构复杂,文件琐碎的文件可以选择压缩保存。
我们有三种格式选择: zip(不是坛子里的那个 :p) , rar 和dmg。偶推荐使用dmg。
A zip: 最通用的压缩格式,选择一个目录/文件按右键,选择"归档"即可。但是这样创建的zip文件压缩比不大,而且在pc上经常会发生打不开的情况。所以如果你经常使用zip格式,请下载一个合适的软件。狮子推荐"ZipIt",它使用很方便。但是不支持压缩中文名字的文件。
B rar: 亚洲比较常见的压缩格式。优点是压缩比较大,缺点是苹果上需要另外下载软件支持。比如"UnrarX" ,它支持中文密码。
C dmg: 我们经常下载到的文件都是这个格式的。严格来说它并不是压缩包,而是磁盘映像。但是它是压缩保存的,所以也可以帮我们节省磁盘空间。使用这个格式的好处是需要用的时候不需要解压缩,直接装载就可以了,目录结构,图标什么的会被完整保留。 软件推荐使用"EasyDmg" ,一个拖拽动作搞定一切。当然高手也可以选择系统附带的磁盘工具来做。

第五步 释放临时空间

如果你浏览了大量的网页,safari可能会吃掉上G的硬盘作为虚拟
内存。注销(apple+option+shift+Q)然后重登陆就可以释放这些空间,作为救急手段很有效。
最后一步 硬盘不是垃圾站

删除那些你安装了但是从来不用的软件(比如Garageband就占了1G多的空间,而大部分人甚至不知道自己安装了这个程序。但是注意别删错了!),安装的游戏超过3个的话请只留下最常玩的2-3个。长期不使用的文件请刻录保存。申请一个网上空间把硬盘里你觉得鸡肋的多媒体文件放上去。
好了,清理的差不多了,现在看看你的剩余空间,是不是有地方放新的垃圾了呢
我们的口号是:

“只有找不着,没有删不掉。”
“空间就像海绵里的水,只要愿挤,总是有的。”
“以节省空间为荣,以浪费空间为耻。”
“不清理硬盘的苹果迷是不合格的苹果迷。”
......

此线下为热心网友的补充, 欢迎您回贴,和大家共享一下经验吧


by 小贝壳:
其實在老虎肚子裡還有很多可以刪除的文件
比如自帶的壁紙 屏保之類的 還有一些iLife的聲音組件
還有很多軟體的pdf說明文檔之類的
總之定期的在電腦裡清理一些不用的資源是完全應該

(Via MacX.cn.)

简单五步回收你的Mac硬盘空间

原文地址: http://www.techpwn.com/?p=235
以下是简单摘要翻译:

1.清理默认打印机驱动.
在 /Library/Printers 里把不需要的打印机驱动删除能回收2G的空间.误删的话需要重装打印机驱动.

2.用智能文件夹寻找大文件.
一些不常用或是无用的大的文件时间长了忘记放哪了,可以用智能文件夹来管理.打开你的Finder,点击“文件”, 然后点 “新建智能文件夹”. 在第一个下拉菜单里, 选择 “大小”然后设置一个你相要的大小.找到不需要的大文件就删了吧,比如看过了的电影之类.

3. 清理你的应用程序 .
很容易积累一些你不再使用的程序.清理这些很能腾出空间.但你直接把它们删除还会留下些文件在系统里.删除这些文件的最好方法是用专门的卸载工具来删除程序. AppZapper不错, 但最好的免费的替代品是AppDelete.

4. 清理缓存.
很多程序都会使用缓存,如果不清里就会积累. 例如浏览器缓存,但其他程序或者系统的缓存不好弄.市面上有些程序能自动帮你搞定这些,例如Cocktail,但要花钱. 你也可以自己清理缓存. 这样做没多大风险,因为大多程序运行时会自动建立缓存. Mac 的缓存文件位于 /Library/Caches. 要记住一旦清除了浏览器的缓存,访问网站会要你重新输入密码,没什么大不了的…

5. 控制你的媒体文件 .
媒体文件大多很大,用iTunes的时候要注意不要无意间复制了这些文件.用iDupe能完美的找出iTunes里的重复文件. 如果你有重复的图片可以试试 “Duplicate Annihilator”,它像iDupe处理音乐一样处理你的图片.另一些清理媒体文件的方法是删除陈旧的 podcasts并且确保不为了同一景点存了13张图片,挑张最好的就行了.同时, 如果你有外接硬盘, 把你的图片和电影都搬过去, 会节省你很多的电脑空间.

额外提示:可以用Monoligual删除OSX里不必要的语言.它可以节约到2.2 GB以上的空间.(当然了,对我们中文用户就节约不了那么多...)但要小心按程序的提示使用,因为一旦你删了不该删的语言,你可能会后悔. 按提示使用会很顺利的.

以上就是简单的翻译.如果你空间实在是腾不开,我还有一招,删除不需要的字体.更狠的还有,删除一些你用不到的东西,如Python,Perl,Ruby等等...不过应该还不至于如此.