奇怪的数组行为?

时间:2011-10-14 16:31:43

标签: ruby

我一直在练习编写一些算法(求职面试时间),编写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

1 个答案:

答案 0 :(得分:4)

在这种情况下,你误解了操作员的工作方式:

string = 'test'
# => 'test'
string + 'string'
# => 'teststring'
string
# => 'test'
string << 'string'
# => 'teststring'
string
# => 'teststring'

String +方法返回表示组合值的新字符串。数组<<运算符会向数组附加内容,但不会创建新副本。

你可能想要的是:

binary + [ 0 ]

这将创建一个新数组,但效率不高。

重要的是要记住Ruby中的变量表示对Object的引用,并且作为参数传递给任何东西的任何值都是共享引用。除非您使用指针或其他类型的显式引用,否则其他语言将隐式复制所有参数以避免此问题。

换句话说,传入方法的数组与方法接收的数组相同,因此对它的任何修改都会在方法范围之外持续存在。