确定两个数组是否相等

时间:2013-06-10 22:28:57

标签: c++ arrays algorithm

您将获得两个数组以确定它们是否相等?

解决它的一种方法是使用哈希表。如何使用哈希表完成此操作?

4 个答案:

答案 0 :(得分:4)

使用std::array

std::array<int, 3> var = {{ 1, 2, 3 }},
                   bar = {{ 4, 5, 6 }};
                   baz = {{ 1, 2, 3 }};

std::cout << std::boolalpha << (var == baz)  // true
                            << (bar == baz); // false

答案 1 :(得分:2)

这样的事情会在O(n)中完成。

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <random>
#include <unordered_map>

using namespace std;

bool equal( const vector<int> &v1, const vector<int> &v2 )
{
    if ( v1.size() != v2.size() )
        return false;

    unordered_map <int,int> map1, map2;

    for ( auto it = v1.begin(); it != v1.end(); ++it )
        map1[*it]++;

    for ( auto it = v2.begin(); it != v2.end(); ++it )
        map2[*it]++;

    if ( map1 != map2 )
        return false;

    return true;
}

int main()
{
    // create first array
    vector<int> v1(10);
    generate_n(v1.begin(), v1.size(), rand);

    // create second array
    vector<int> v2 (v1);
    std::random_shuffle(v2.begin(),v2.end());

    // print arrays
    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, "\t")); cout << endl;
    copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, "\t")); cout << endl;

    cout << (equal(v1,v2) ? "equal" : "not equal") << endl;

    return 0;
}

答案 2 :(得分:1)

由于您标记了此C ++,因此您可以直接使用operator ==上的重载std::array

答案 3 :(得分:0)

如果它只是算法,并且您想使用类似哈希表的内容,请按照以下步骤操作:

  1. 创建一个大小等于要比较的数组内可能的字符/数字的新表(例如,如果要比较的数组具有ASCII字符,则需要创建大小为255的选项卡)。
  2. 用零(0)填充新表。
  3. 浏览第一个表(循环for)并递增哈希表的字段,该字段的索引等于测试字符:for (int i=0; i<tab1.size; i++) hashtab[tab1[i]]++;

  4. 浏览第二个表(循环)并递减哈希表的字段,该索引等于测试字符。for (int i=0; i<tab2.size; i++) hashtab[tab2[i]]--;

  5. 最后浏览你的哈希表(循环)。如果其任何字段与0不同,则表不包含相同的元素。否则,表格包含相同的元素。

  6. 如果到达表的末尾而没有返回false,那么它全部为零。 例如,这可用于查看两个单词是否由相同的字母组成(完全相同的字母,每个单词的编号相同)。