Bazist / HArray

Fastest Trie structure (Linux & Windows)
GNU General Public License v3.0
92 stars 10 forks source link

Search by range (dozen) #1

Closed Bazist closed 7 years ago

Bazist commented 7 years ago

Поиск по диапазону принимает указатель на ключи... но не принимает их длину. Таким образом, реально могут использоваться только ключи длиной в 32бита. 2хuint32 уже никак -- ибо мы не знаем, где ключ кончается:

`

include "stdafx.h"

include

include

include

include

include "HArrayInt.h"

include "HArrayVarRAM.h"

using namespace std;

uint32 totalHArrayTime = 0; uint32 totalDenseTime = 0; uint32 totalMapTime = 0; uint32 totalUnorderedMapTime = 0;

HArrayVarRAM ha;

ulong64 msclock() { return (ulong64)clock() * 1000 / CLOCKS_PER_SEC; //in ms }

uint32 key(const char c) { char key1 = new char[sizeof(uint32)]; memset(key1,0,sizeof(uint32)); strcpy(key1,c); return (uint32)(*key1); }

void search(const char msg, uint32 key1,uint32* key2) { HArrayFixPair pairs[32]; uint32 val = ha.getKeysAndValuesByRange(pairs,sizeof(pairs)/sizeof(HArrayFixPair),key1,key2); printf("%s %d\n",msg,val); for( int i=0; i<val; i++ ) { printf(" val %d = %d/%d\n",i,pairs[i].Key[0],pairs[i].Value);
} }

int main() { printf("Pointer size: %ld\n", sizeof(void*));

uint32 key1 = key("AAA");
printf("key1: %d\n",key1);
uint32 key2 = key("BAA");
printf("key2: %d\n",key2);
uint32 key3 = key("CAA");
printf("key3: %d\n",key3);
uint32 key4 = key("DAA");
printf("key4: %d\n",key4);

ha.init(26);

ha.insert(&key1,sizeof(uint32),12345678);
ha.insert(&key2,sizeof(uint32),22345678);
ha.insert(&key3,sizeof(uint32),32345678);

uint32 ret = ha.getValueByKey(&key1, sizeof(uint32));
printf("%d -> %d\n",key1,ret);

ret = ha.getValueByKey(&key2, sizeof(uint32));
printf("%d -> %d\n",key2,ret);

ret = ha.getValueByKey(&key3, sizeof(uint32));
printf("%d -> %d\n",key3,ret);

search("search",&key1,&key4);

// delete

printf("delete %d\n",key2);
ha.delValueByKey(&key2, sizeof(uint32), 0);//22345678);
ret = ha.getValueByKey(&key2, sizeof(uint32));
printf("%d -> %d\n",key2,ret);

printf("delete again %d\n",key2);
ha.delValueByKey(&key2, sizeof(uint32), 0);//22345678);
ret = ha.getValueByKey(&key2, sizeof(uint32));
printf("%d -> %d\n",key2,ret);

printf("delete fake %d\n",key4);
ha.delValueByKey(&key4, sizeof(uint32), 0);//22345678);
ret = ha.getValueByKey(&key4, sizeof(uint32));
printf("%d -> %d\n",key4,ret);

search("search after del",&key1,&key4);

// search by reverse
search("rev search",&key4,&key1);

// search by same
search("search same key",&key1,&key1);

// search limitations
uint32 key20[] = { 100 };
uint32 key21[] = { 100, 500 };
uint32 key22[] = { 100, 600 };
uint32 key23[] = { 200 };

ha.insert(key20,sizeof(key20),1100);
ha.insert(key21,sizeof(key21),1100500);
ha.insert(key22,sizeof(key22),1100600);
ha.insert(key23,sizeof(key23),1200);

ret = ha.getValueByKey(key20, sizeof(key20));
printf("%d -> %d\n",key20,ret);
ret = ha.getValueByKey(key21, sizeof(key21));
printf("%d -> %d\n",key21,ret);
ret = ha.getValueByKey(key22, sizeof(key22));
printf("%d -> %d\n",key22,ret);
ret = ha.getValueByKey(key23, sizeof(key23));
printf("%d -> %d\n",key23,ret);

search("search 20..23",key20,key23);

search("search 21..22",key21,key22);

ha.printStat();
ha.destroy();

return 0;

}; `

Тут передали указатели на ключ 22 и 23. Но код смотрит только на 100, так что и возвращает всё, что имеет 100 в первом сегменте`

Bazist commented 7 years ago

Works !

void testRange() { HArray ha; ha.init(26);

uint32 key1[] = {100, 200};
uint32 key2[] = {200, 300, 400};
uint32 key3[] = {200, 300, 500};
uint32 key4[] = {300, 400, 500, 600};
uint32 key5[] = {300, 500, 600};
uint32 key6[] = {300};
uint32 key7[] = {400, 500};

ha.insert(key1, sizeof(key1), 1);
ha.insert(key2, sizeof(key2), 2);
ha.insert(key3, sizeof(key3), 3);
ha.insert(key4, sizeof(key4), 4);
ha.insert(key5, sizeof(key5), 5);
ha.insert(key6, sizeof(key6), 6);
ha.insert(key7, sizeof(key7), 7);

HArrayPair* pairs = new HArrayPair[10];

uint32 count = ha.getKeysAndValuesByRange(pairs,
                                       10,
                                       key6,
                                       8,
                                       key2,
                                       4);

for(uint32 i=0; i<count; i++)
{
    printf("%u\n", pairs[i].Value);
}

}