我有以下字符串,需要霍夫曼编码并将其有效地存储到位数组中:
>>> print sequence
GTCAGGACAAGAAAGACAANTCCAATTNACATTATG|
Run Code Online (Sandbox Code Playgroud)
中的符号频率为sequence:
>>> print freqTuples
[(0.40540540540540543, 'A'), (0.1891891891891892, 'T'), (0.16216216216216217, 'C'), (0.16216216216216217, 'G'), (0.05405405405405406, 'N'), (0.02702702702702703, '|')]`
Run Code Online (Sandbox Code Playgroud)
我将其翻译成霍夫曼代码字典:
>>> print codeDict
{'A': '1', 'C': '010', 'G': '001', 'N': '0110', 'T': '000', '|': '0111'}
Run Code Online (Sandbox Code Playgroud)
然后,我使用Python bitstring包将字符串逐个字符地转换为BitArray该类的实例,我称之为bitArray,该实例包含每个用其各自的霍夫曼代码编码的字符的位:
>>> print bitArray.bin
0b001000010100100110101100111100110101101100000100101100000001101010100000010000010111
Run Code Online (Sandbox Code Playgroud)
这是位数组,以字节为单位:
>>> print bitArray.tobytes()
!I\254\363[^D\260^Z\240Ap
Run Code Online (Sandbox Code Playgroud)
我必须使用tobytes()而不是bytes,因为我生成的位数组不能平均分为8位段。
当我计算表示的存储效率BitArray(位数组和输入字符串的大小之比)时,与未对输入字符串进行未编码的情况相比,我得到的性能更差:
>>> sys.getsizeof(bitArray.tobytes()) / float(len(sequence))
1.2972972973
Run Code Online (Sandbox Code Playgroud)
我是否正确测量存储效率?(如果我对更长的输入字符串进行编码,则该比率会提高,但似乎接近0.28的渐近极限。我想确认这是否是正确的度量方法。)
编辑
以下两种方法得出不同的答案:
>>> print len(bitArray.tobytes()) / float(len(mergedSequence))
0.297297297297
>>> print bitArray.len …Run Code Online (Sandbox Code Playgroud) 你如何连接位串.我的意思是位串,因为我不知道字节数是8的倍数.
A = <<3:2>>
B = <<1:1>>
C = <<15:4>>
Solution should A|B|C should be <<127:7>>
Run Code Online (Sandbox Code Playgroud)
谢谢
给定一个n位向量和一个整数k,1 <= k <= n,我们必须通过多次应用以下操作(包括零次)来最大化其中的个数:
经过分析,我得出结论,如果n> k,我们也可以同时翻转任意两位。例如,对于n = 5,k =4。我们可以这样做,仅翻转最后两位。
“ x”表示我们在该位置翻转位。
但是我不确定之后该如何进行,而且我无法再进行任何观察了。那么,什么是正确的方法呢?您可以假设使用n ^ 2算法是可行的。
如果我们有一个给定的谓词p :: [Bool] -> Bool,它接受无限列表作为参数并返回True或False基于某些未知条件,并且我们不知道这个谓词是什么。
我们能否设计一个函数f :: ([Bool] -> Bool) -> [Bool],采用这样的谓词并返回一个无限列表 l where p l == True,假设谓词是可满足的。
我正在努力做项目Euler 219号,但我没有掌握它.我正在尝试使用Python,根据项目Euler应该能够在一分钟内完成它!这让我觉得他们不可能想要我计算每个单独的位串,因为在Python中它太慢了 - 必须有一个子O(n)算法.
我查看了一个递归解决方案,它存储了位串可能的前缀,以便它可以快速选择一个新的位串,甚至可以将它们分组考虑.这仅适用于超过10的强制值:
cost(1) = 1
cost(2) = 5
cost(3) = 11
cost(4) = 18
cost(5) = 26
cost(6) = 35
cost(7) = 44
cost(8) = 54
cost(9) = 64
cost(10)= 74
cost(11)= 85
cost(12)= 96
Run Code Online (Sandbox Code Playgroud)
过去这个,我正在努力理解如何减少问题.总是可以制作如下的模式:
1
01
001
0001
00001
00000
Run Code Online (Sandbox Code Playgroud)
但对于7位以上的字符串来说,这不是最佳选择.任何人都可以指导我应该考虑什么?
我有个十六进制字符一些256个字符的字符串代表位标志的序列,我试图将其转换回为一个比特,所以我可以操纵它们&,|,vec等.十六进制字符串是用整数范围的大端组写的,这样一组8个字节就像"76543210"应转换为"\x10\x32\x54\x76"位串,即最低的8位00001000.
问题是pack'" h"格式一次只能输入一个字节,而不是8,因此直接使用它的结果将不是正确的顺序.目前我正在这样做:
my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));
Run Code Online (Sandbox Code Playgroud)
哪个有效,但感觉很乱.似乎应该有一个更清洁的方式,但我的pack-fu不是很强大.有没有更好的方法来进行这种翻译?
我试图找出一种方法来查看一个位串在比特串大小n中是否有少于n次的2个连续的.
例如,假设我们的字符串大小为5(索引0-4).如果索引1和3都是0,我可以返回false.但如果它们都是那些,那么我可能需要做5次才能找到答案.
bitstring不必是长度5.为简单起见,假设它可以在3到8之间.
我有一个160个字符串的字符串,我需要一个整数数组来存储值为1的位的位置.
例:
bitstring = '00110101'
array = [3,4,6,8]
Run Code Online (Sandbox Code Playgroud)
是否可以仅使用SQL执行此操作,还是需要定义PL/SQL函数或类似的东西?
请问我们如何efficiently计算酏剂中汉字的重量?
示例:0b0101101001汉明权重为5(即设置为5位)
我的尝试:
iex> Enum.count(Integer.to_char_list(n,2),&(&1===49))
Run Code Online (Sandbox Code Playgroud) 我有bytes需要转换为的类型的值BIT STRING
bytes_val = (b'\x80\x00', 14)
索引零中的字节需要转换为长度由第二个元素(在本例中为 14)指示的位串,并格式化为如下所示的 8 位组。
预期输出 => '10000000 000000'B
另一个例子
bytes_val2 = (b'\xff\xff\xff\xff\xf0\x00', 45) #=> '11111111 11111111 11111111 11111111 11110000 00000'B
Run Code Online (Sandbox Code Playgroud)