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

Posted

技术标签:

【中文标题】为啥我们在 C++ 中使用 pos?假设我的代码 int pos = cHash(symbol);【英文标题】:why do we use pos in c++? assume by my code int pos = cHash(symbol);为什么我们在 C++ 中使用 pos?假设我的代码 int pos = cHash(symbol); 【发布时间】:2021-07-09 15:56:19 【问题描述】:

所以我正在为我的编译器课程编写一个 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;
    

【问题讨论】:

pos 是数组中的位置 ... 实际上你不必在这里使用pos,因为你可以存储和使用指针或block[cHash(symbol)]的引用来代替。 您需要询问教授课程的人。我们不能说为什么在没有关于发生了什么信息的情况下在随机函数中使用变量。 我投票结束,因为没有足够的上下文来回答。我们不知道block 是什么。假设它是一个数组,那么当然需要某种方法来知道要更新哪个元素,因此[pos]。通过分解到一个函数来减少这种重复肯定是有余地的,该函数需要一个 MysteriousBlockType& ,您将 block[pos] 传递给该函数,因此只索引一次。但不清楚您的问题是“为什么要索引 ”还是“我可以索引 less”。 谢谢大家我理解这个问题 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于为啥我们在 C++ 中使用 pos?假设我的代码 int pos = cHash(symbol);的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们需要在 C++ 头文件中使用“#if defined Identifier”?

为啥使用命名空间在我的 C++ 项目中不起作用?

为啥我的 VS Code 调试器在我的 C++ 代码周围弹跳?

为啥当我为 C++ 代码打印字符时,我的终端会发出哔声?

为啥我的 C++ 代码中出现链接器命令失败错误? [复制]

为啥我的 C++ 代码比 LeetCode 上的 C 代码慢三倍? [关闭]