gpt4 book ai didi

ruby - 查找数组是否包含另一个数组的任何成员的最快方法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:33:06 24 4
gpt4 key购买 nike

我正在尝试检测以字符串形式读入的文件是否是:

  1. 文本(某种类型的单字节编码)。
  2. 多字节编码,或者二进制等。

我有一个字符/字节的“黑名单”数组,normally will never occur在“文本”中:

bad_bytes = [0, 1, 2, 3, 4, 5, 6, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 127]

my_bytes = File.binread('some_file').bytes

我能想到的:

  • (my_bytes & bad_bytes).empty?,和
  • my_bytes == (my_bytes - bad_bytes)

两者都产生了正确的结果,我的直觉是后者可能更快一些。或者,也许它们完全等价?但就我的目的而言,两者对我来说似乎都相当低效。我不需要真正找到完整交集,也不需要从第一个数组中删除第二个数组的每个实例 - 找到一个公共(public)元素是足够了。

我是否缺少一些已经存在的方法来执行此操作?有更快的技术吗?如果不是,以上哪个更快?还是我处理这一切都错了?

此外,对于奖励积分:是否有数学/计算机科学/花哨术语来描述我在这里尝试做的事情?

最佳答案

您可以通过使用正则表达式和 String#[] 来避免转换为字节数组。 :

bad_bytes_pattern = /[#{ Regexp.escape(bad_bytes.map(&:chr).join) }]/n
#=> /[\x00\x01\x02\x03\x04\x05\x06\v\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1C\x1D\x1E\x1F\x7F]/

str = File.binread('some_file')

if str[bad_bytes_pattern]
# contains bad bytes
else
# ...
end

您可以使用字符范围来简化正则表达式:

bad_bytes_pattern = /[\x00-\x06\x0B\x0E-\x1A\x1C-\x1F\x7F]/n

关于ruby - 查找数组是否包含另一个数组的任何成员的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27248040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com