我需要基本上合并一个二进制堆和线性探测哈希表来制作一个“复合”数据结构,它具有堆的功能,具有哈希表的排序能力。
我需要做的是为每个数据结构(二进制堆和哈希)创建 2 个二维数组,然后用指针将它们相互链接,这样当我更改内容时,例如删除二进制堆中的值,它也会得到在哈希表中删除。
因此,我需要让 Heap 数组的一行从 Heap 指向 Hastable,而 hashtable 数组的一行从 hashtable 指向堆。
我需要基本上合并一个二进制堆和线性探测哈希表来制作一个“复合”数据结构,它具有堆的功能,具有哈希表的排序能力。
我需要做的是为每个数据结构(二进制堆和哈希)创建 2 个二维数组,然后用指针将它们相互链接,这样当我更改内容时,例如删除二进制堆中的值,它也会得到在哈希表中删除。
因此,我需要让 Heap 数组的一行从 Heap 指向 Hastable,而 hashtable 数组的一行从 hashtable 指向堆。
创建一个包含两者的容器,以及执行算法所需的所有操作的访问器函数/方法(取决于您的实现语言)。
IE:从容器中删除:从二进制和哈希中删除。
添加到容器:添加到二进制和哈希。
编辑:哦,一个任务 - 有趣!:)
我会这样做:仍然实现一个容器。但是,不要为 btree/hash 使用标准库,而是像这样实现它们:创建一个可以放入数据成员中的类型,该类型具有指向数据元素所在的 BTree 节点和 Hashtable 节点的指针。
要删除一个数据元素,给定一个指向它的指针,您可以在 btree(从节点指针导航到父节点、删除子节点(左或右)、重构树)和哈希表(从哈希列表中删除)上执行删除算法)。添加值时,对 btree 和 hash 执行 add 算法,但请确保在返回之前更新数据中的节点指针。
一些伪代码(我将使用 C,但我不确定您使用的是什么语言): typedef struct { BTreeNode* btree HashNode* hash } ContianerNode;
将数据放入容器中:
typedef struct
{
ContainerNode node;
void* data; /* whatever the data is */
} Data;
BTreeNode 有类似的东西:
typedef struct _BTreeNode
{
struct _BTreeNode* parent;
struct _BTreeNode* left;
struct _BTreeNode* right;
} BTreeNode;
一个 HashNode 有类似的东西:
typedef struct _HashNode
{
struct _HashNode* next;
} HashNode;
/* ala singly linked list */
并且您的 BTree 将是指向 BTreeNode 的指针,而您的 hastable 将是指向 HashNodes 的指针数组。像这样:
typedef struct
{
BTreeNode* btree;
HashNode* hashtable[HASHTABLESIZE];
} Container;
void delete(Container* c, ContainerNode* n)
{
delete_btree_node(n->btree);
delete_hashnode(n->hash);
}
ContainerNode* add(Container* c, void* data)
{
ContainerNode* n = malloc(sizeof(ContainerNode));
n->btree = add_to_btree(n);
n->hash = add_to_hash(n);
}
我会让你完成那些其他功能(不能为你完成整个任务;))
为什么要打扰链接?
您有两个关联结构,只是将一个上的任何操作复制到另一个上(确保如果一个操作除外,您要么使整个事物崩溃,要么让对象处于有效状态,如果您关心这些事情)
除非您可以利用其中一个的结构来帮助您处理另一个(我不知道您如何做到这一点,因为任何一个都可以在任何修改操作中完全重新安排其内部状态),这同样有效且简单得多。
当然,这意味着任何修改操作的 O() 成本是最昂贵的成本,并且内存成本加倍,但原始计划确实如此,除非它们是我遗漏的一些技巧。