Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 查找一个整数数组是否是另一个整数数组的置换_Arrays - Fatal编程技术网

Arrays 查找一个整数数组是否是另一个整数数组的置换

Arrays 查找一个整数数组是否是另一个整数数组的置换,arrays,Arrays,给定两个大小为N的整数数组,设计一个算法来确定其中一个数组是否是另一个数组的置换。也就是说,它们是否包含完全相同的条目,但顺序可能不同 我可以想出两种方法: 排序并比较:O(N.log N+N) 检查数组是否有相同数量的整数,并且这些整数的和是否相同,然后对两个数组进行异或运算,查看结果是否为0。这是O(N)。我不确定这种方法是否能完全消除误报。思想。更好的算法 检查数组是否有相同数量的整数,并且这些整数的和是否相同,然后对两个数组进行异或运算,查看结果是否为0 这不管用。例如: a = [1,

给定两个大小为N的整数数组,设计一个算法来确定其中一个数组是否是另一个数组的置换。也就是说,它们是否包含完全相同的条目,但顺序可能不同

我可以想出两种方法: 排序并比较:O(N.log N+N)

检查数组是否有相同数量的整数,并且这些整数的和是否相同,然后对两个数组进行异或运算,查看结果是否为0。这是O(N)。我不确定这种方法是否能完全消除误报。思想。更好的算法

检查数组是否有相同数量的整数,并且这些整数的和是否相同,然后对两个数组进行异或运算,查看结果是否为0

这不管用。例如:

a = [1,6]  length(a) = 2, sum(a) = 7, xor(a) = 7
b = [3,4]  length(b) = 2, sum(b) = 7, xor(b) = 7
其他人已经为O(n)解决方案建议了
HashMap

这里有一个C语言中的O(n)解决方案,使用
字典


对两个数组的内容进行数字排序,然后比较每个第n项


您还可以在array1中获取每个项目,然后检查它是否存在于array2中。记下你找到的匹配项的数量。最后,匹配的数量应该等于数组的长度。

如果空间复杂度
O(n)
不是问题,您可以在
O(n)
中执行此操作,方法是首先在哈希映射中存储第一个数组中每个值的出现次数,然后在第二个数组上运行第二个过程,检查映射中是否存在每个元素,减少每个元素的出现次数。

最好的解决方案可能是使用键为两个数组中的值的映射进行计数

通过一个数组创建/递增适当的贴图位置,然后通过另一个数组创建/递减适当的贴图位置

如果生成的映射完全由零组成,则数组相等

这是O(N),我不认为你能做得更好


我怀疑这大概就是马克·拜尔斯在回答中所说的。

如果我检查产品是否相同会怎么样?@Bruce:那也不行。考虑一个简单的情况,两个数组至少共享10。@马克:你需要一个<代码> HashMap <代码>来解释损坏的条目。@ JO圣奥:好点。出于某种原因,我假设不会有重复的,但问题肯定没有说明这一点。你所说的“对两个数组进行异或”是什么意思?在我熟悉的大多数语言中,XOR只为整数定义。如果允许数组包含重复项,则必须对它们进行计数。@DonRoby:是的,我已经将答案从哈希集更改为哈希映射,谢谢。现在它与我的答案相同。但无论如何,请投赞成票@那么Hashmap的键是数字,值是频率?
bool IsPermutation<T>(IList<T> values1, IList<T> values2)
{
    if (values1.Count != values2.Count)
    {
        return false;
    }

    Dictionary<T, int> counts = new Dictionary<T, int>();
    foreach (T t in values1)
    {
        int count;
        counts.TryGetValue(t, out count);
        counts[t] = count + 1;
    }

    foreach (T t in values2)
    {
        int count;
        if (!counts.TryGetValue(t, out count) || count == 0)
        {
            return false;
        }
        counts[t] = count - 1;
    }

    return true;
}
>>> a = [1, 4, 9, 4, 6]
>>> b = [4, 6, 1, 4, 9]
>>> c = [4, 1, 9, 1, 6]
>>> d = [1, 4, 6, 9, 4]
>>> from collections import Counter
>>> Counter(a) == Counter(b)
True
>>> Counter(c) == Counter(d)
False