标签: bitstring

使用Python位串测量Huffman编码的效率

我有以下字符串,需要霍夫曼编码并将其有效地存储到位数组中:

>>> 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)

python compression bitstring huffman-code bitarray

5
推荐指数
1
解决办法
1825
查看次数

在Erlang中连接BitStrings(非二进制)

你如何连接位串.我的意思是位串,因为我不知道字节数是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)

谢谢

binary erlang concatenation bitstring

5
推荐指数
1
解决办法
1471
查看次数

通过一次翻转k位使最大值为1

给定一个n位向量和一个整数k,1 <= k <= n,我们必须通过多次应用以下操作(包括零次)来最大化其中的个数:

  • 精确选择k位(不一定是连续的)并翻转其状态(0到1、1到0);

经过分析,我得出结论,如果n> k,我们也可以同时翻转任意两位。例如,对于n = 5,k =4。我们可以这样做,仅翻转最后两位。

  • xxxx_
  • xxx_x

“ x”表示我们在该位置翻转位。

但是我不确定之后该如何进行,而且我无法再进行任何观察了。那么,什么是正确的方法呢?您可以假设使用n ^ 2算法是可行的。

algorithm mathematical-optimization bit bitstring

5
推荐指数
1
解决办法
158
查看次数

我们可以构造一个满足给定位谓词的无限列表吗?

如果我们有一个给定的谓词p :: [Bool] -> Bool,它接受无限列表作为参数并返回TrueFalse基于某些未知条件,并且我们不知道这个谓词是什么。

我们能否设计一个函数f :: ([Bool] -> Bool) -> [Bool],采用这样的谓词并返回一个无限列表 l where p l == True,假设谓词是可满足的。

haskell predicate list bitstring

5
推荐指数
1
解决办法
135
查看次数

项目欧拉#219

我正在努力做项目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位以上的字符串来说,这不是最佳选择.任何人都可以指导我应该考虑什么?

algorithm math bitstring

4
推荐指数
1
解决办法
1580
查看次数

在Perl中将分组的十六进制字符转换为位串

我有个十六进制字符一些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不是很强大.有没有更好的方法来进行这种翻译?

perl endianness bitstring pack

4
推荐指数
1
解决办法
2823
查看次数

在不到n次的时间内在一个位串中找到两个连续的1?

我试图找出一种方法来查看一个位串在比特串大小n中是否有少于n次的2个连续的.

例如,假设我们的字符串大小为5(索引0-4).如果索引1和3都是0,我可以返回false.但如果它们都是那些,那么我可能需要做5次才能找到答案.

bitstring不必是长度5.为简单起见,假设它可以在3到8之间.

algorithm bits bitstring

4
推荐指数
1
解决办法
1652
查看次数

在PostgreSQL中将位字符串转换为数组

我有一个160个字符串的字符串,我需要一个整数数组来存储值为1的位的位置.

例:

bitstring = '00110101'
array = [3,4,6,8]
Run Code Online (Sandbox Code Playgroud)

是否可以仅使用SQL执行此操作,还是需要定义PL/SQL函数或类似的东西?

arrays postgresql bitstring postgresql-9.2

4
推荐指数
2
解决办法
1885
查看次数

Elixir中BitString的位计数或汉明重量?

请问我们如何efficiently计算酏剂中汉字的重量?

示例:0b0101101001汉明权重为5(即设置为5位)

我的尝试:

iex> Enum.count(Integer.to_char_list(n,2),&(&1===49)) 
Run Code Online (Sandbox Code Playgroud)

elixir bitstring hammingweight

4
推荐指数
1
解决办法
381
查看次数

python字节到位串

我有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)

python byte bitstring

4
推荐指数
1
解决办法
797
查看次数