algorithm - 从由自定义类的对象组成的列表中删除重复项的有效算法
问题描述
我有一个自定义课程。该类具有浮点、日期、字符和字符串属性。示例类定义如下。
类 MyClass { 字符串 str1; 字符串 str2; 日期日期1;日期日期2;浮动金额1;浮动金额2;字符 char1, 字符 char2 };
任务是识别该类对象列表中的重复项。每个对象都可以标记为仅与另一个对象重复。对于为保留的对象标识的所有重复项,将创建一个重复项列表。执行特定操作,最终删除重复项,仅保留唯一对象。这里提到的第二个操作与此任务无关,因此不详细提及。
我已经定义了一个比较运算符来检测该类的两个对象是否相同。比较是基于比较该类的各个属性,然后寻找与它们匹配的那些属性的组合,以确定两个对象是否相同。各个属性的比较是模糊的。然后参考用于检查类匹配的属性组合的规则库来确定这两个对象是否被认为是相同的。
当前算法的时间复杂度为 O(n^2)。
从该类的对象列表中删除重复项的最有效算法是什么?
该列表中的最大对象数约为千或最多两千。该类的每个实例都不会消耗大量内存。通常,列表中的对象数少于 50-100。我们的分析研究表明,在列表中可能包含的大量示例中,我们没有超过 2% 或 3% 的重复项。应避免误报和误报。这再次超出了问题的范围,因为它是我不想解决的比较运算符的函数。
我想代替当前的 O(n^2) 算法对列表进行排序,然后使用单遍查找和删除重复项将产生 O(n* log n) + O(n) 时间复杂度。后一种用于大 n 的算法 - 比如说 > 10 将比具有 O(n ^2) 时间复杂度的算法执行得更好。排序可能需要编写一个小于/大于运算符,这是可以做到的。
我会欣赏考虑空间和时间复杂性的选项。
解决方案
推荐阅读
- c# - 在 Windows 窗体应用程序中解析传感器输入
- python - 紧凑的if循环python
- typescript - 在 Typescript 中声明/更改对象的当前类型
- mysql - 选择语句不返回任何行
- flutter - 在 SearchDelegate Flutter 中更改 searchFieldLabel 的字体样式
- javascript - 节点 js Javascript 对象显示在 HTML 正文中,但不在终端和控制台中
- google-data-studio - 将 Data Studio 中的多个字段合并为来自同一来源的单个字段
- ruby-on-rails - 我可以覆盖所有模型的 as_json 方法吗?
- azure - 使用云存储集成从与 Snowflake 不同的 Azure 区域中的 Blob 复制数据
- selenium - 量角器 webdriver-manager 权限?