判断随机产生单词的另一种方法
来源:互联网 发布:ebsco数据库如何进入 编辑:程序博客网 时间:2024/04/25 22:04
在上一篇中我介绍了判断随机产生单词的3种方法,大致都是用了外在程序spell。现在本猫又在Mac OS X系统上找到了如下文件:/usr/share/dict/words ,其中放置了N多个英语单词啊:
apple@kissAir: dict$ls -ldh words
lrwxr-xr-x 1 root wheel 4B 10 18 14:00 words -> web2
apple@kissAir: dict$ls -lh web2
-r--r--r-- 1 root wheel 2.4M 9 10 04:47 web2
apple@kissAir: dict$wc -n words
wc: illegal option -- n
usage: wc [-clmw] [file ...]
apple@kissAir: dict$wc -l words
235886 words
一行一个单词,即一共23万多个单词,我们可以抛掉spell程序,自己写一个is_spell?方法来判断单词是否可拼写啦,以下是增加way4后的代码,放弃了命令行参数的方式,而是用benchmark包来测试性能:
#!/usr/bin/ruby#code by hopy 2014.12.08#random create some words and check if a valid word!require 'tempfile'require 'benchmark'words_path = "/usr/share/dict/words"f = File.open(words_path,"r")$lines = f.readlines$lines.map! {|word|word.chomp!}f.closedef rand_words(n=10000,min_len=2,max_len=12)chars = (("a".."z").to_a * max_len).freezewords = []srandn.times do |x|len = min_len + (rand*1000).to_i % max_lenidxes = []len.times {idxes<<(rand*100)%26}chars.shufflewords << chars.values_at(*idxes).joinidxes.clearend wordsend#ret word that can spell or ret nil. (way1)def spell_word(word)cmd = `echo #{word}|spell`.chompif cmd == wordreturn nilelsereturn wordendend#spell all words by tmpfile. (way2)def spell_words(words)puts "using spell_words..."f = Tempfile.new("#{$$}_spell_blablabla")#f = File.open("spell_test","w+")#f.write Marshal.dump(words)f.write words.join(" ")f.closecmd = `spell #{f.path}`no_spell_words = cmd.split("\n")words - no_spell_wordsend#spell all words by tmpfile and spell ret is also use tmpfile. (way3)def spell_words2(words)puts "using spell_words2..."f_words = Tempfile.new("#{$$}_spell_words")f_ret = Tempfile.new("#{$$}_spell_ret")f_ret.closef_words.write words.join(" ")f_words.closecmd = `spell #{f_words.path} > #{f_ret.path}`f=File.open(f_ret.path)no_spell_words = f.read.split("\n")f.closewords - no_spell_wordsenddef is_spell?(word)$lines.include? wordend#利用is_spell?判断word是否可拼写的方法。(way4)def spell_words3(words)=beginwords.each do |word|printf "#{word} " if is_spell?(word)end=endwords.select {|word|is_spell?(word)}enddef sh_each_spell_word(spell_words)spell_words.each {|word|printf "#{word} "}endwords_count = 2000$words = nilputs "words_count is 2000,now test..."Benchmark.bm do |bc|bc.report("rand_words:\n") {$words = rand_words(words_count)};puts ""bc.report("way1:spell_word:\n") {$words.each {|w|printf "#{w} " if spell_word(w)}};puts ""bc.report("way2:spell_words:\n") {sh_each_spell_word(spell_words($words))};puts ""bc.report("way3:spell_words2:\n") {sh_each_spell_word(spell_words2($words))};puts ""bc.report("way4:spell_words3:\n") {sh_each_spell_word(spell_words3($words))};puts ""end
不过Mac OS X自身不带spell程序,用brew不知要安装哪一个;而虚拟机中的ubuntu的spell死活无法升级。等明天用本猫的x61来测试吧!
现在已经是明天鸟!发现ubuntu中自带的words文件包含单词比Mac下的要少,只有9万多个单词啊,遂将其用Mac下的文件替换,可以看到他比spell程序实际枚举的单词要多哦:
wisy@wisy-ThinkPad-X61:~/src/ruby_src$ ./x.rbwords_count is 2000,now test... user system total realrand_words: 0.050000 0.000000 0.050000 ( 0.069850)way1:spell_word:ho of ts mu so or wag us to lo um ts pa pip mid hip vs no of oboe iv yr re so 0.330000 3.170000 13.480000 ( 29.903239)way2:spell_words:using spell_words...ho of ts mu so or wag us to lo um ts pa pip mid hip vs no of oboe iv yr re so 0.000000 0.000000 0.080000 ( 5.485613)way3:spell_words2:using spell_words2...ho of ts mu so or wag us to lo um ts pa pip mid hip vs no of oboe iv yr re so 0.010000 0.010000 0.100000 ( 4.854248)way4:spell_words3:ho of pob dob mu bo so sa or wag us jo aw to lo um li ca se pa ava bo sho pip mid til tue ya en hip no of di ug oboe io en yr re da eer so ym 36.580000 0.290000 36.870000 ( 37.444370)
我们写的新的方法(way4)竟然是最慢的!!!不试不知道,一试吓一跳啊!
- 判断随机产生单词的另一种方法
- 随机产生的单词文档排序
- 产生随机数组的方法
- shuffle:随机打乱一个数组的顺序的另一种方法
- 随机产生单词然后判别其是否是真正的(可拼写的)单词:)
- 产生随机字符串的一种方法
- 产生唯一随机码的方法分析
- 随机不重复队列的产生方法
- 产生随机概率的c方法
- 随机产生一组中文字符串的方法
- 产生唯一随机码的方法分析。
- mysql + shell 随机字符的产生方法
- 指定范围的随机整数产生方法
- 判断磁盘是否是USB连接的另一种方法
- 【代码备忘】VC判断自己窗口的另一种方法
- 判断输入年份是否为闰年的另一种方法
- 判断文件是否存在的另一种方法 _access 和 _waccess
- 产生随机的数组
- Android 框架练成 教你打造高效的图片加载框架
- JDBC读取数据库元数据,生成JAVA实体类
- v$active_session_history
- 动态规划-数塔
- 关于C++中的静态成员变量
- 判断随机产生单词的另一种方法
- android基础笔记——监听数据变化,即时更新ListView:adapter.notifyDataSetChanged();
- 重复格式化namenode造成datanode无法正常启动的解决办法
- LinuxMint使用kvm(spice)安装Windows7 笔记
- App最新上线流程全攻略(史上最详细步骤)
- 指针与const
- IOS开发-数据持久化(二)【sqlite数据库】
- sed直接替换文件内容
- 12-11java面向对象之内部类操作