【问题标题】:Is this approach to check duplicates in an array relatively efficient? Why or why not?这种检查数组中重复项的方法是否相对有效?为什么或者为什么不?
【发布时间】:2016-05-10 13:34:33
【问题描述】:

我只是想检查我的数组中是否包含任何重复项。我在谷歌上搜索并看到了一些方法:

  • 双 for 循环遍历数组并比较每个项目
  • 创建一个字典来存储每个项目的出现次数

但是这些方法需要很多循环,我有点懒得只为这个功能编写大量代码。 xD。

于是我想到了这个创造性的方式:

let containsDuplicates = Set(array).count != array.count

但是,这种方法比其他两种方法快还是慢?我不确定,因为它似乎创建了一个我认为需要循环遍历数组的集合。而且我不知道访问count 是否也会遍历整个数组。

如果我在数组中最多只有 50 个项目,这是否重要?

【问题讨论】:

  • 试一试,量一下时间……
  • 试试什么?我不知道如何测量代码执行时间。 @MartinR 而且我也想知道why,不知道怎么找到答案。
  • 这是我在“Swift measure execution time”中找到的第一个 Google 搜索结果:stackoverflow.com/questions/24755558/…。答案也取决于数组的内容,例如它包含多少个重复项。
  • 这可能还取决于元素类型:比较两个数组元素的成本是多少?

标签: arrays swift duplicates


【解决方案1】:

这几乎是最好的方法。字典存储是固定时间的,每个项目只需要存储一次,因此它是O(n) 解决方案,而O(n^2) 用于双for-loop 方法。空间效率较低,但现在这通常不是问题。

如果您经常这样做,我建议您使用某种混合数据结构,这样您就不会不断地从头开始生成这些Sets。

【讨论】:

  • 您能否详细说明“混合数据结构”?听起来很模糊。
  • 制作您自己的struct/class,它具有ArraySet 属性。实现add/remove/等。同时add/remove/等的方法。来自ArraySet。这样,调用contains 可以只使用现有集合,而不会浪费O(n) 时间在每次调用时重新创建它。
【解决方案2】:

我的第一个想法是创建一个集合并查看元素的数量是否与数组不同,就像你一样。 Apple 可能已经很好地优化了这种转换,并且这样做可以使代码紧凑且易于理解。

您没有提及数组的用途和使用方式,但您是否可以只使用集合而不是数组,这样一开始就不会添加重复项?或者,如果您需要跟踪有多少但仍需要轻松了解唯一值,则创建一个使用字典进行存储的新类。关键是您存储在数组中的内容,但将是唯一的,并且值将是计数。

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2015-02-05
    • 2015-07-29
    • 1970-01-01
    • 2021-07-19
    • 2011-03-02
    • 2012-09-18
    • 2018-12-29
    相关资源
    最近更新 更多