Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Algorithm_Search_Data Structures_Hashmap - Fatal编程技术网

Arrays 查找数组中出现奇数次的所有元素

Arrays 查找数组中出现奇数次的所有元素,arrays,algorithm,search,data-structures,hashmap,Arrays,Algorithm,Search,Data Structures,Hashmap,我遇到了以下问题: '查找数组中出现奇数次的所有元素' 我的想法是: 使用HashMap:在数组中添加值作为HashMap中的键。每个键对应的值将是遇到该键的次数 使用O(N log N)中的快速排序对数组进行排序,然后遍历数组以检查哪些元素出现奇数次 你觉得呢,还有其他的方法吗?如果没有,那么这两种方法中哪一种更好 提前谢谢 您可以修改第一种方法以使用哈希集而不是哈希映射 创建一个初始为空的哈希集。检查数组中的元素。对于每个元素,检查哈希集:如果当前数组元素不在该集中,则添加它;否则,请将其移

我遇到了以下问题:

'查找数组中出现奇数次的所有元素'

我的想法是:

  • 使用
    HashMap
    :在数组中添加值作为HashMap中的键。每个键对应的值将是遇到该键的次数

  • 使用O(N log N)中的快速排序对数组进行排序,然后遍历数组以检查哪些元素出现奇数次

  • 你觉得呢,还有其他的方法吗?如果没有,那么这两种方法中哪一种更好


    提前谢谢

    您可以修改第一种方法以使用哈希集而不是哈希映射

    创建一个初始为空的哈希集。检查数组中的元素。对于每个元素,检查哈希集:如果当前数组元素不在该集中,则添加它;否则,请将其移除

    当到达数组末尾时,哈希集将包含数组中出现奇数次的每个对象

    由于访问散列集中的元素是
    O(1)
    ,因此该算法具有
    O(N)
    时间复杂性。

    更好取决于上下文。使用散列映射或散列集将更快,并且具有不修改原始数组的优点,但它需要O(N)个额外内存。排序和计数需要更长的时间并修改数组,但不需要额外的内存


    您选择哪种解决方案取决于您是否能负担得起额外的内存。

    基本上,这可以作为重新平衡效率的练习来完成:您查看您的数字列表,然后针对集合中已有的每个数字,再次删除它。这样,您的比较集大约是可能的最大值的一半。当然,这不会改变O(n lg n),并且您在每个步骤上都会得到一个分配/解除分配,这可能会非常昂贵

    因此,使用混合策略可能会很有趣:快速排序非常快,但您基本上希望在两个条目相等时合并它们,并且至少(n-1)/2个条目相等。快速排序实际上不适合在排序时删除元素


    因此,对于基于数组的方法(为了降低分配成本),我宁愿使用一些基于堆的方法。每当你偶然遇到相等的元素时,你就会删除一个。堆排序与快速排序相比非常有竞争力,能够提前修剪树会很有帮助。

    谢谢您的回答。但是,为什么
    HashSet
    而不是
    HashMap
    HashSet
    避免重复元素的优点对我们没有多大帮助,因为我们无论如何都要搜索该元素,如果我们找到该元素,我们将删除,否则将添加。@Vikram With
    HashMap
    您正在存储显式计数。在Java中,这意味着存储一个包装好的整数,从中只需要它的最后一位(决定它是偶数还是奇数的那个位),并且无论如何都要丢弃它。在其他语言中,您仍然会存储一个完整的整数,当您只需要一个位时,这是一种浪费。这个答案说明了为什么这个人有200000个点…做得很好。如果发生冲突,哈希集难道不会没有O(1)访问权限吗?@committedandroider假设一个高质量的哈希函数,hast表将摊销为O(1)。一个单独的操作可能需要更长或更短的时间,但在N个操作的过程中,每个操作的平均时间是恒定的。是的……你有一个有效的点!如果我们选择进行排序,数组将被修改。