2011-10-14 166 views
3

我一直在練習編碼一些算法(求職面試時間),並編寫了霍夫曼壓縮算法,並且遇到了類似於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 

這工作得很好,但我以前一直空數組作爲二進制PARAM傳球,然後追加到該數組

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 

回答

4

你誤解了運營商在這種情況下是如何工作的:

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

絃樂+方法返回一個代表組合值一個新的字符串。數組<<操作符將某些東西附加到數組中,但它不創建新副本。

你可能想要的是:

binary + [ 0 ] 

這將創建一個新的數組,但它不是特別有效。

重要的是要記住,Ruby中的變量表示對對象的引用,並且作爲參數傳入的任何值都是共享引用。其他語言將隱式複製所有參數以避免此問題,除非您使用指針或其他類型的顯式引用。

換句話說,傳遞給該方法的數組與該方法接收的數組是相同的,所以對它的任何修改都會在該方法的範圍之外。

+0

感謝您的解釋! –