我正在寻找一种方法来优化我的实现。基本上这是一个类似“reduce”的(来自 Map Reduce 框架)功能。它需要一个键和它的值。目标是检查所有值是否不同,并以列表的形式输出它们:value1;value2;value3;...valuen; 作为一个字符串。n 可以非常大(以 1000 秒计)
void unique(char *key, int keybytes, char *multivalue, int nvalues,
int *valuebytes, KeyValue *kv, void *ptr) {
char * value = NULL;
char * elem[nvalues];
int i, j, cx;
char adj[3858905] = "";
大问题是我必须为每个输入指定 char adj[] 长度,而且我不知道值的数量有多大。(这需要大量的内存)
for (i = 0; i < nvalues; i++) {
if (i == 0) {
value = multivalue;
} else {
value = multivalue + valuebytes[i - 1];
multivalue = multivalue + valuebytes[i - 1];
}
elem[i] = value;
}
size_t elem_length = sizeof(elem)/sizeof(char *);
qsort(elem, elem_length, sizeof(char *), cstring_cmp);
cx = sprintf(adj, "%s;", elem[0]);
j = 0;
for (i = 1; i < nvalues; i++) {
bool matching = false;
if (!strcmp(elem[i], elem[j]))
matching = true;
j++;
if (!matching) //{;}
cx += snprintf(adj + cx, 3858905 - cx - 1, "%s;", elem[i]);
}
adj 是一个输出字符串 - 值列表。
kv->add(key, keybytes, adj, strlen(adj) + 1); //this outputs key-value pairs.
}
我必须只使用 C/C++。