为什么我们在 C++ 中使用 pos?假设我的代码 int pos = cHash(symbol);

问题描述

所以我正在为我的编译器课程做一个 SymbolTable 程序......我遇到了 pos 的问题......为什么我们首先使用它? TIA

void insert(char *symbol,char *type)
{
    int pos = cHash(symbol);

    if (block[pos] == NULL)
    {
        block[pos] = new SymbolInfo();
        block[pos]->symbol = symbol;
        block[pos]->type = type;
        block[pos]->next = NULL;
    }
    else
    {
        SymbolInfo *newNode = new SymbolInfo();
        newNode->symbol = symbol;
        newNode->type = type;

        // pointer swap
        SymbolInfo *nextNode = block[pos];
        block[pos] = newNode;
        newNode->next = nextNode;
    }
}

解决方法

这里的代码实现了所谓的链式哈希表。我们维护一个链表数组,并使用函数 cHash 将每个符号分配给这些链表之一。

以这种方式存储东西的优点是速度。如果我们把所有东西都放在一个链表中,那么查找某样东西的平均成本是 O(n),其中 n 是链表中的项目数,因为平均而言我们至少要查看链表中的一半项目列表。但是通过拥有多个链表(例如,其中的 b 个)并或多或少地随机分布项目,我们将查找的平均成本降低到 O(1 + n/b),如果 b 大致为与 n 的数量级相同。

,

如果链中没有元素,则在前面添加新元素, 否则通过散列,如果我们到达一个链或包含一个元素的桶,那么我们在链的开头插入新元素,并且 其余元素链接到新节点的末尾。