Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优雅地计算ruby中单词的字谜签名?_Ruby_Algorithm - Fatal编程技术网

如何优雅地计算ruby中单词的字谜签名?

如何优雅地计算ruby中单词的字谜签名?,ruby,algorithm,Ruby,Algorithm,出于这个问题,我正在寻找一种优雅的(ruby)方法来计算答案中建议的单词签名 建议的想法是对单词中的字母进行排序,并对重复的字母进行游程编码。例如,“mississippi”首先变成“IIIIMPPSSS”,然后可以通过编码为“4impp4s”进一步缩短 我对ruby还比较陌生,虽然我可以一起破解一些东西,但我相信这对于那些对ruby有更多经验的人来说是一个简单的例子。我很想了解人们的方法,提高我的ruby知识 编辑:澄清一下,计算签名的性能对我的应用程序没有多大影响。我希望计算签名,这样我就可

出于这个问题,我正在寻找一种优雅的(ruby)方法来计算答案中建议的单词签名

建议的想法是对单词中的字母进行排序,并对重复的字母进行游程编码。例如,“mississippi”首先变成“IIIIMPPSSS”,然后可以通过编码为“4impp4s”进一步缩短

我对ruby还比较陌生,虽然我可以一起破解一些东西,但我相信这对于那些对ruby有更多经验的人来说是一个简单的例子。我很想了解人们的方法,提高我的ruby知识


编辑:澄清一下,计算签名的性能对我的应用程序没有多大影响。我希望计算签名,这样我就可以将它与每个单词一起存储在一个大型单词数据库中(450K个单词),然后查询具有相同签名的单词(即给定单词的所有拼字法,即实际的英语单词)。因此,人们关注空间。“优雅”部分只是为了满足我的好奇心。

我也不是一个喜欢Ruby的人,但正如我在另一条评论中所指出的,这似乎适用于所描述的算法

s = "mississippi"
s.split('').sort.join.gsub(/(.)\1{2,}/) { |s| s.length.to_s + s[0,1] } 
当然,您需要确保单词是小写的,不包含数字等

根据要求,我将尝试解释代码。请原谅我,如果我没有得到所有的Ruby或reg-ex术语正确,但这里有

我认为拆分/排序/连接部分非常简单。对我来说,有趣的部分是从打电话给gsub开始的。这将用后面块的返回值替换与正则表达式匹配的子字符串。reg ex查找任何字符并创建反向引用。这就是“()”部分。然后,我们使用反向引用“\1”继续匹配过程,该反向引用的计算结果为匹配的第一部分找到的任何字符。我们希望在总共最少出现三次的情况下,至少再找到该字符两次。这是使用量词“{2,}”完成的

如果找到匹配项,则匹配的子字符串将作为参数传递给下一个代码块,这要归功于“|s |”部分。最后,我们使用匹配子字符串长度的字符串等价物,并将构成该子字符串的任何字符(它们都应该相同)附加到该字符串,然后返回连接的值。返回的值替换原始匹配的子字符串。整个过程将继续进行,直到没有任何内容需要匹配,因为它是原始字符串的全局替换


如果这让人困惑,我道歉。通常情况下,对我来说,将解决方案形象化要比清楚地解释更容易。

我看不到一个优雅的解决方案。您可以使用
split
消息将字符放入数组中,但是一旦您对列表进行了排序,我就看不到一个很好的线性时间连接原语来返回字符串。我很惊讶

顺便说一句,运行长度编码几乎肯定是浪费时间。在我认为值得考虑之前,我必须看到一些令人印象深刻的测量结果。如果避免运行长度编码,则可以对任何字符串进行语法化,而不仅仅是对字母字符串进行语法化。如果你知道你只有字母,并试图节省空间,你可以把它们5位打包成一个字母

---Irma Vep



编辑:另一张海报找到了我错过的
join
。很好。

创建字母排序列表的最快方法是:

"mississippi".unpack("c*").sort.pack("c*")

它比split(“”)和join()快很多。为了进行比较,最好将数组重新打包成字符串,这样就不必比较数组。

您可以使用str.scan(/。/)或str.split(“”)来形成一个字符数组,对数组进行排序,然后将其与字符串#join,虽然将其重新连接到字符串中是不必要的。+1指出RLE可能不会节省太多空间。您能通过测量支持这一说法吗?例如,在10000个单词的列表中(
/usr/dict/words
?)速度要快多少?这很有趣,但非常神秘。好的,快速比较一下:5.5秒与Ruby 1.8.7的8.5秒相比,所以解包和打包要快一点。我认为与JRuby的区别更大,但我真的不记得了。我为我的字谜查找器做了这个调整:5.5秒在一个32万字+1的dict上,这正是我头脑中想出的解决方案,在考虑了很久之后,我没有看到一个更简单的方法。我编辑了答案,以适应没有滚动条的页面,并将//更改为“”,这与语法突出显示效果更好(it things//开始注释)。似乎工作得很好…您能否编辑以解释其工作原理?拆分/排序/联接将字符串转换为字符数组,对其进行排序,然后将排序结果转换回字符串。gsub用运行长度和运行中的第一个字符(在该运行中所有字符都相同)替换任何3个或更多相同字符的运行。