最近在C语言中针对重复数据消除的高效集成员资格测试?

最近在C语言中针对重复数据消除的高效集成员资格测试?,c,duplicates,set,C,Duplicates,Set,我收到的12字节消息数量不限。内容可以被视为随机的、无结构的。长度之所以重要,是因为它比大多数散列要短 我想对它们进行重复数据消除 一种方法是将最后1000条消息存储在循环缓冲区中,并在接受消息并将其插入循环缓冲区以备将来检查之前检查所有1000条消息是否匹配 还有哪些方法可以提高CPU和内存效率?12字节的长度似乎很小。您可以将字节数组强制转换为字符串,然后通过利用strcmp使用基于字符串的树结构 基于字符串的树结构 除非形成一个倾斜的树,否则Ologn将是重复数据消除的最坏情况。在这种情况

我收到的12字节消息数量不限。内容可以被视为随机的、无结构的。长度之所以重要,是因为它比大多数散列要短

我想对它们进行重复数据消除

一种方法是将最后1000条消息存储在循环缓冲区中,并在接受消息并将其插入循环缓冲区以备将来检查之前检查所有1000条消息是否匹配


还有哪些方法可以提高CPU和内存效率?

12字节的长度似乎很小。您可以将字节数组强制转换为字符串,然后通过利用strcmp使用基于字符串的树结构

基于字符串的树结构

除非形成一个倾斜的树,否则Ologn将是重复数据消除的最坏情况。在这种情况下,也不难改为自平衡树

下面是我使用字符串类型键的BST实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct Node
{
  char *key;
  char *value;
  struct Node *left;
  struct Node *right;
};

struct Node* newNode(char *strKey,char *strValue)
{
  struct Node *tmp = (struct Node*) malloc(sizeof(struct Node));
  tmp->key = strdup(strKey);
  tmp->value = strdup(strValue);
  tmp->left = NULL;
  tmp->right = NULL;
  return tmp;
}

struct Node* insert(struct Node* node, char *newKey, char *newValue)
{
  if (node == NULL)
    return newNode(newKey,newValue);

  int comparison = strcmp(newKey,node->key); 
  if (comparison < 0)
    node->left  = insert(node->left, newKey, newValue);
  else if (comparison > 0)
    node->right = insert(node->right, newKey, newValue);  
  else
  {
    printf("Error occured while insert to BST\n");
    return NULL;
  }

  return node;
}

struct Node* deleteNode(struct Node* node, char *key2del)
{
  if (node == NULL)
    return node;

  int comparison = strcmp(key2del,node->key);
  if (comparison < 0)
    node->left = deleteNode(node->left, key2del);
  else if (comparison > 0)
    node->right = deleteNode(node->right, key2del);
  else // where deletion occurs
  {
    if (node->left == NULL)
    {
      struct Node *tmp = node->right;
      free(node);
      return tmp;
    }
    else if (node->right == NULL)
    {
      struct Node *tmp = node->left;
      free(node);
      return tmp;
    }

    struct Node *tmp = node->right;
    while(tmp->left != NULL)
      tmp = tmp->left;

    node->key = tmp->key;
    node->right = deleteNode(node->right, tmp->key);
  }

  return node;
}

你想要12字节的序列,即你的消息是唯一的?是的,我只想接受最近1000条或更多消息中没有看到的12字节消息。你可以使用加密哈希,但它们可能是cpu密集型的,你也可以使用哈希桶,基于哈希函数,在每个bucket中,要发送的消息数量将减少compare@Pras不需要散列,消息比好的散列要短。哪一个更节省CPU和内存我认为你不能两者兼得。Bucket可以加快搜索速度,但当然需要比简单的循环缓冲区更多的内存。这是否意味着要与最后1000条消息的缓冲区一起工作,以便在添加新的、唯一的消息时可以删除最旧的消息?我没有对数据结构进行这样的限制,但您可以在调用insert方法时轻松做到这一点。基本上只需将节点数量限制在1000个,您就可以得到您想要的:在插入新节点时,您如何知道要删除哪个最旧的节点,除非您以插入顺序维护所有节点的单独列表?对我来说,最好的方法是将顺序保留在缓冲区中(如果适用)。否则,BST或标准自平衡树(如AVL或红黑)将不提供此类功能。因此,要么保留一个单独的列表,要么在缓冲区中保留顺序。感谢您的回答,但我怀疑,除了维护原始循环缓冲区外,维护一棵树是否比只测试循环缓冲区中的1000个值进行检查要快。malloc本身大约有300个CPU周期。对于大型消息缓冲区,您的解决方案将比仅使用循环缓冲区更有效。