Find
场景说明
参数结构体存储了哈希表已存储的键值对,给定一个要查找的键keys以及未查找到对应键插入的值defaultValue,长度length,查找的值会存储于values。例如:
1 2 3 4 5 6 7 8 9 10 11 12 | int64_t keyBucket[] = {104, 101, 201, -1}; //已存储于哈希表的键值 float valueBucket[] = {4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 0, 0, 0, 0, 0, 0, 0, 0}; keys: [101, 110, 201, 104] defaultValue: [1, 1, 1, 1, 1, 1, 1, 1] values:[1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7] length: 4 |
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <cmath> #include <random> #include <cstdint> #include <iostream> #include "ktfop.h" void KtfopLog(int level, const char *message) { std::cout << level << ' ' << message << std::endl; } int main() { using namespace ktfop; SetExternalLogFunc(KtfopLog); int64_t numBuckets = 4; //配置哈希桶个数 int64_t valueSize = 8; //配置embedding长度 int64_t emptyKey = -1; //空键所代表的值 int64_t deletedKey = -2; //已删除键所代表的值 int64_t keyBucket[] = {104, 101, 201, -1}; float valueBucket[] = {4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 0, 0, 0, 0, 0, 0, 0, 0}; TableInfo info {numBuckets, valueSize, emptyKey, deletedKey, keyBucket, valueBucket}; int64_t length = 4; int64_t keys[] = {101, 110, 201, 104}; auto *values = new float[info.valueSize * length]; float defaultValue[] = {1, 1, 1, 1, 1, 1, 1, 1}; int ret = Find(info, keys, values, defaultValue, length); std::cout << "values: ["; for (int i = 0; i < info.valueSize * length; ++i) { std::cout << values[i]; if (i < info.valueSize * length - 1) { std::cout << ", "; } } std::cout << "]" << std::endl; //键列表含有空键,打印日志"ERROR Using the emptyKey as a table key is not allowed." keys[0] = info.emptyKey; ret = Find(info, keys, values, defaultValue, length); //键列表含有表示已删除的键,打印日志"ERROR Using the deletedKey as a table key is not allowed" keys[0] = info.deletedKey; ret = Find(info, keys, values, defaultValue, length); //输入空指针,打印日志"ERROR Parameter verification failed for the Find Op." keys[0] = 101; ret = Find(info, nullptr, values, defaultValue, length); //输入空指针,打印日志"ERROR Parameter verification failed for the Find Op." info.valueBucket = nullptr; ret = Find(info, keys, values, defaultValue, length); //emptyKey=deletedKey,打印日志"ERROR Empty and deleted key cannot be equal." info.valueBucket = valueBucket; info.emptyKey = info.deletedKey; ret = Find(info, keys, values, defaultValue, length); //numBuckets不是2的幂,打印日志"ERROR numBuckets must be power of 2." info.emptyKey = -1; info.numBuckets = 5; ret = Find(info, keys, values, defaultValue, length); //numBuckets小于0,打印日志"ERROR numBuckets is invalid." info.numBuckets = 4; info.numBuckets = -1; ret = Find(info, keys, values, defaultValue, length); //length小于0,打印日志"ERROR Length value is invalid." info.numBuckets = 4; ret = Find(info, keys, values, defaultValue, static_cast<size_t>(-1)); //valueSize小于0,打印日志"ERROR valueSize is invalid." info.valueSize = -1; ret = Find(info, keys, values, defaultValue, length); //keyBucket 排布规律错误,打印日志"ERROR Internal error in MutableDenseHashTable lookup." info.valueSize = valueSize; info.keyBucket[3] = 202; ret = Find(info, keys, values, defaultValue, length); delete[] values; } |
父主题: 使用示例