【问题标题】:How to insert elements in an array without duplicate?如何在不重复的数组中插入元素?
【发布时间】:2019-06-25 11:17:44
【问题描述】:

我想用 c 语言编写一个高效的程序,它可以读取文件中的元素并将其放入数组中。我的想法是有一个函数来查找数组中是否存在的每个元素,但是它花费的时间太长而且每个文件都有数百万个元素(重复)。你知道如何在不重复的情况下将这些元素插入到数组中吗?

注意:这些元素是 10 位数字,包含被占用位置的矩阵不是一个选项

【问题讨论】:

  • @AgustinFerrante -- 使用哈希图有同样的问题 -- 不,它没有。如果你有一个整数映射和与整数相关的计数,那么复杂度如何?
  • 我知道这是C,但是std::mapstd::unordered_map 如何在C++ 中工作?它通过使用键/值对来工作。您的问题更多地与数据结构和理解它们有关。声称 hasmap 或哈希表查找值的速度很慢,您一个接一个地遍历键是完全不正确的。为什么存在哈希表?不是出于好奇,而是出于真正的原因,即快速查找时间。
  • @AgustinFerrante 你对哈希图了解多少?要搜索它,您可以使用散列算法在 O(1) 时间内将输入转换为输出(忽略冲突)。
  • @AgustinFerrante 看来大学也希望你对散列和散列图进行独立研究。
  • 是的,我相信我们正在做 OP 的功课。这个问题似乎是为了让学生研究如何减少时间,而不是在这里得到现成的答案。

标签: c


【解决方案1】:

如果你想只存储一次所有元素你可以在c++中使用STL set (下面还给出了在c 中执行此操作的示例)。它存储一个值不超过一次。你可以像这样声明一个set

set<int>sett;

set中插入一个值

sett.insert(6);

打印集合中的所有值:

for(auto a: sett){
    cout<<a<<endl;
}

您可以访问geekforgeekcplusplus 网站了解更多信息。

如果你想跟踪一个数字是否在数组中,你可以像这样有效地做到这一点:

取一个布尔数组Map,并将其全部设为初始值false。从文件中扫描后,如果数字为 N,则将布尔数组或映射的第 N 个索引设为true

现在如果你想检查数字 M 是否在数组中。您可以通过检查布尔数组或 Map 的第 M 个索引是否为 true 或不是在 O(1) 时间内轻松获得。

请参见下面的示例,这是使用 布尔数组 完成的。如果布尔数组的大小太大,请记住全局清除布尔数组。您也可以在 c++ 中使用 STL 映射 来做到这一点。如需了解有关SLT MAP的更多信息,请访问cpluspluscppreferencegeeksforgeeks

#include <stdio.h>
#include <stdbool.h>

bool mapp[999999999] = {false};

int main()
{
    int i, n, t, m, ara[1000];
    printf("Input the size of array: ");
    scanf("%d", &n);
    for(i = 0; i < n; i++){
        scanf("%d", &ara[i]);
        mapp[ara[i]] = true;
    }
    printf("Input number of time you want to check a number in array or not: ");
    scanf("%d", &t);
    while(t--){
        scanf("%d", &m);
        if(mapp[m] == true)
            printf("Number Exists\n");
        else
            printf("Number Not Exists\n");

    }
}

您也可以使用此技巧在数组中不包含重复值。为此,如果输入的数字是“a”。检查mapp[a] 是否已经标记为true。仅在数组中包含“a”且仅在 mapp[a] != ture 时才包含。这个小改动会从你的数组中排除所有重复的值。

scanf("%d", &n);
j = 0;
for(i = 0; i < n; i++){
    scanf("%d", &a);
    if(mapp[a] != true){
        mapp[a] = true;
        ara[j++] = a;
    }
}

【讨论】:

  • 当我评论帖子中有 C 和 C++ 标签时。我会尽力提供相应的帮助
  • 如果您只阅读前几句话“我想在 c 中制作一个高效的程序”,您就可以在付出这些努力之前意识到它是在 C 中的
  • 有时人们将 c、c++、c++11、c++14、c++17 统称为 c。帖子的两个标签让我相信,如果我用 C 的任何变体编写解决方案,这将很有用。感谢您的评论,我将编辑我的第二部分并用 C 更改它。再次感谢
猜你喜欢
  • 2013-10-24
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多