자바에서 C++ patricia trie를 다시 작성하려고합니다. 는 C++ 코드는 내가 조금 붙어있어 here자바에서 patricia trie를 구현하십시오.
에서입니다. 우리는 키 256 비트의 배열을 만들
#define ZEROTAB_SIZE 256
head->key = (char*)calloc(ZEROTAB_SIZE, 1);
, 그래서 우리는 최대 32 자 길이의 문자열을 가질 수 있고 모든 문자는 8 비트로 표현된다
그래서 여기 내 이해입니다. 자바에서 문자 배열을 사용하여이를 구현할 수 있습니까?
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 8 제로보다 낮은 것을 제거하는 것이다 오른쪽으로 이동하기 때문에) 문자열의 N/8 문자로 이동 bit_stream [n >> 3]의 값을 k로 곱한 다음 마지막 비트를 얻습니다. 내가 자바에서 배열을 사용한다면 이것을 다시 쓸 수 있겠습니까?
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);
}
지금이 두 번째까지 첫 번째 부분이지만, 내가 어떻게 두 번째 루프 확실하지 않다 우리가 두 키의 주소를 가져 와서 만약 그들이 동등한 지 첫 번째 비트를 검사하고 만약 우리가 불균등 한 비트를 찾을 때까지 다시 검사한다면?
주로 키의 주소가 여기에 어떻게 사용되는지 잘 모르겠지만 bit_get 클래스에서도 비트 시프트에 대해 혼란 스러울 수 있습니다.
나는 거기에 C++에서 trie를 비교하고 자바에 대한 자바 클래스를 만들고 싶습니다. 구현을 가능한 한 비슷하게 유지하고 싶습니다.
calloc (256, 1)은 1 바이트 씩 256 개의 요소에 대해 메모리를 할당합니다. Byte, not bit. –
https://github.com/rkapsi/patricia-trie/blob/master/src/main/java/org/ardverk/collection/PatriciaTrie.java – PiotrNycz