求助,如题。 我想如果用任何字符串处理肯定是慢的。
用与或计算应该会比较快一点。
str.count '1'
#1 楼 @luikore 如果我有 1000 万条数据,每条都有 1000 个长度的数字,然后做这个计算那不是很慢么。
#2 楼 @hlxwell 可能汇编里有对应指令。但如果是 1000 万条数据的话,那你就别想了,这种事情除了并行计算外没有快的办法了。
#3 楼 @iBachue 我的意思是如果 str.count "1"需要 1 秒,是不是如果用数字计算只需要 0.01 秒了呢,这样就可以快 100 倍了
http://en.wikipedia.org/wiki/Hamming_weight
http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer
#5 楼 @reus #6 楼 @bhuztez
Thanks
瓶颈在你把数据读出来需要的时间,而不是计算方法
#8 楼 @luikore 直接丢数据库里去算啊...
#8 楼 @luikore 一语中的
@hlxwell 你本来的问题是什么?可能针对那个问题有更快的解决方案。但是用了这样的存储方式没法快了...
#9 楼 @bhuztez 数据库也要读硬盘的啊
#11 楼 @luikore 如果说这个计算时间跟硬盘 io 的时间比,微乎其微的话,其实也倒是无所谓了。
如果是 mysql,可以就地算,update _ set _ = bit_count(_),不用读到 client
update _ set _ = bit_count(_)
#12 楼 @hlxwell 是很微小
require 'benchmark'; s='1' * 1000_000_000; puts Benchmark.measure{s.count '1'} 0.780000 0.000000 0.780000 ( 0.778674)
问题是数据的来源就是字符串,你要用某种基于数值或者位的算法来处理的话,还要首先将字符串转成数字,这个时间代价不一定比 String#count 小吧
啊,怎么都看不懂
我想知道 10100101011101010101011011010101,这个是什么类型的数据?
#17 楼 @rubyu2 字符串,或者你可以存成数字。