我正試圖在java中重寫C++ patricia trie。 C++代碼是從here在java中執行patricia trie
我有點卡住了。
因此,這裏是我的理解:
#define ZEROTAB_SIZE 256
head->key = (char*)calloc(ZEROTAB_SIZE, 1);
我們創造的關鍵256位的陣列,所以我們可以有32個字符的最大長度的字符串,每個字符表示與8位。我可以用java中的char數組實現這個嗎?
template <class T>
int PatriciaTrie<T>::bit_get(PatriciaTrieKey bit_stream, int n) {
if (n < 0) return 2; // "pseudo-bit" with a value of 2.
int k = (n & 0x7);
return ((*(bit_stream + (n >> 3))) >> k) & 0x1;
}
k得到n的最後7位,我們移動到字符串的N/8個字符(不完全N/8,因爲右移將消除任何比8至零下),那麼我們轉向bit_stream [n >> 3]的值由k表示,然後我們得到最後一位。如果我在java中使用數組,我可以將其重寫爲
return (bit_stream[n>>3] >> k) & 0x1;
?
template <class T>
int PatriciaTrie<T>::bit_first_different(PatriciaTrieKey k1, PatriciaTrieKey k2) {
if (!k1 || !k2)
return 0; // First bit is different!
int n = 0;
int d = 0;
while ((k1[n] == k2[n]) &&
(k1[n] != 0) &&
(k2[n] != 0))
n++;
while (bit_get(&k1[n], d) == bit_get(&k2[n], d))
d++;
return ((n << 3) + d);
}
現在這是它得到混亂,第一部分,直到第二while循環看起來不夠清楚,環路和檢查有多少位是平等的,不爲零,但我不知道是什麼的第二個循環我們把這兩個鍵的地址,並檢查第一個比特,如果他們是平等的,如果他們是我們再次檢查,直到我們發現不等比特?
主要我不確定在這裏如何使用密鑰的地址,但我可能會在bit_get類的位移時感到困惑。
我想做一個比較之間的c + +和我的Java類java和我想保持儘可能相似的實現。
calloc(256,1)爲每個1字節大的256個元素分配內存。字節,而不是位。 –
https://github.com/rkapsi/patricia-trie/blob/master/src/main/java/org/ardverk/collection/PatriciaTrie.java – PiotrNycz