我一直在练习编写一些算法(求职面试时间),编写Huffman压缩算法并在Ruby数组类中遇到奇怪的行为。
一旦构建了我的堆,我会对树进行前序遍历,并将符号和二进制值存储在哈希表中。这是方法。
def encode(huffman_tree, encoded_chars, binary)
if huffman_tree.is_leaf?
encoded_chars[huffman_tree.symbol] = binary
else
encode(huffman_tree.left, encoded_chars, binary + '0')
encode(huffman_tree.right, encoded_chars, binary + '1')
end
end
这样可以正常工作,但我之前已经将一个空数组作为二进制参数传递,然后附加到该数组
def encode(huffman_tree, encoded_chars, binary)
if huffman_tree.is_leaf?
encoded_chars[huffman_tree.symbol] = binary
else
encode(huffman_tree.left, encoded_chars, binary << 0)
encode(huffman_tree.right, encoded_chars, binary << 1)
end
end
我会告诉你,使用一个字符串更有意义,但我想我应该能够用一个数组做同样的事情。然而,当我使用二进制作为数组运行算法时,每次递归调用编码都会导致二进制数组的大小增加(我认为每次方法返回时它都应该超出范围)这里的示例输出以二进制作为字符串运行然后作为一个数组。有人可以解释为什么会这样吗?
string
00000,
00001,
0001,
001,
01000,
01001,
0101000,
01010010
array
00000,
000001,
0000011,
00000111,
000001111000,
0000011110001,
00000111100011000,
0000011110001100010
答案 0 :(得分:4)
在这种情况下,你误解了操作员的工作方式:
string = 'test'
# => 'test'
string + 'string'
# => 'teststring'
string
# => 'test'
string << 'string'
# => 'teststring'
string
# => 'teststring'
String +
方法返回表示组合值的新字符串。数组<<
运算符会向数组附加内容,但不会创建新副本。
你可能想要的是:
binary + [ 0 ]
这将创建一个新数组,但效率不高。
重要的是要记住Ruby中的变量表示对Object的引用,并且作为参数传递给任何东西的任何值都是共享引用。除非您使用指针或其他类型的显式引用,否则其他语言将隐式复制所有参数以避免此问题。
换句话说,传入方法的数组与方法接收的数组相同,因此对它的任何修改都会在方法范围之外持续存在。