【问题标题】:how to implement counting hashmap in c?如何在c中实现计数hashmap?
【发布时间】:2013-07-08 08:45:10
【问题描述】:

我有 6 个 const 字符串(每个 5 个字母)

我得到了几个单词的流(在这 6 个单词中)。

我想计算每个单词出现了多少次。

如何在 C 中实现它?

我试过了:

  char searchEngineNames[6][5] = { "waze_", "faceb", "fours", "googl",
        "fueli", "yello" };

    static void foo(const char* res_name, int success, void *context, char *last_modified) {
        if (success){
                for (int i=0; i<6; i++)
                {
                    char substringFiveChars[6];

                    strncpy(substringFiveChars, res_name, 5);

                            char substringFiveChars[6]; 

                            substringFiveChars[5] = 0;

                    if (strcmp(searchEngineNames[i],substringFiveChars) == 0)
                    {
                    ... 
                    }
    ..
                }

例如对于这个流:

"wooo_","wooo_","faceb","wooo_","google"

我最终会得到:

"wooo_" 3 times

"faceb" 1 times 

"google" 1 times 

"fours" 0 times

"fuelil" 0 times

"yello" 0 times

【问题讨论】:

  • 如果你知道如何实现一个简单的hashmap(而且很容易),你只需将一个字符串作为键,将一个无符号整数作为值。我不确定你到目前为止都尝试了什么。
  • 问题我在 C 中没有字符串。只有 char*。那我还得用3d数组?
  • 不了解你的编程技能,很难知道如何回答。您熟悉链表以及哈希图的工作原理吗?
  • 您需要从您的字符串中获取一个散列并使用此散列来获取您的散列图中的数组中的索引。我不明白为什么是“3d 数组”。
  • 你说“我有 6 个 const 字符串(每个 5 个字母)”,但“google”和“fuelil”是 6 个字母的词。另外,你为什么使用 strncpy 和 strcmp 而不是 strncmp?

标签: c string hashmap


【解决方案1】:

我使用 2 个数组而不是 1 个。

char searchEngineNames[6][5] = { "wooo_", "faceb", "fours", "google",
        "fuelil", "yello" };

int searchEngineCounts[6] = {0,0,0,0,0,0};



static void foo(const char* res_name,
        int success, void *context, char *last_modified) {
    if (success) {

        int i = 0;
        for (i; i < 6; i++) {
            char substringFiveChars[6];

            strncpy(substringFiveChars, res_name+7, 5);

            substringFiveChars[5] = 0;

            if (strcmp(searchEngineNames[i], substringFiveChars) == 0) {
                searchEngineCounts[i]++;

                if (searchEngineCounts[i] < 3) {

...
                }
            }
        }

    }
}

【讨论】:

  • 那不是哈希图。您正在将流中的当前单词与 all searchEngineNames 进行比较。您必须使用散列函数(例如参见cse.yorku.ca/~oz/hash.html)并实现散列映射(根据散列值选择列表的链表数组)。
猜你喜欢
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2021-12-02
相关资源
最近更新 更多