数组删除重复元素

2023-11-22

我有一个未排序的数组,删除元素(如果存在)的所有重复项的最佳方法是什么?

e.g:

a[1,5,2,6,8,9,1,1,10,3,2,4,1,3,11,3]

所以在该操作之后数组应该看起来像

 a[1,5,2,6,8,9,10,3,4,11]

检查每个元素与其他元素的关系

The naive solution is to check every element against every other element. This is wasteful and yields an O(n2) solution, even if you only go "forward".

排序然后删除重复项

更好的解决方案是对数组进行排序,然后检查每个元素与其旁边的元素以查找重复项。选择一种有效的排序,时间复杂度为 O(n log n)。

基于排序的解决方案的缺点是无法维持顺序。然而,一个额外的步骤可以解决这个问题。将所有条目(在唯一排序数组中)放入哈希表中,该哈希表的访问时间复杂度为 O(1)。然后迭代原始数组。对于每个元素,检查它是否在哈希表中。如果是,则将其添加到结果中并从哈希表中删除。您最终将得到一个结果数组,该数组具有原始数组的顺序,每个元素与其第一次出现的位置相同。

整数的线性排序

如果您正在处理某个固定范围的整数,则可以使用基数排序做得更好。例如,如果假设数字都在 0 到 1,000,000 的范围内,则可以分配大约 1,000,001 的位向量。对于原始数组中的每个元素,您可以根据其值设置相应的位(例如,值 13 会导致设置第 14 位)。然后遍历原数组,检查是否在位向量中。如果是,则将其添加到结果数组中并从位向量中清除该位。这是 O(n),用空间换取时间。

哈希表解决方案

这使我们找到了最好的解决方案:这种排序实际上是一种干扰,尽管很有用。创建具有 O(1) 访问权限的哈希表。遍历原始链表。如果哈希表中尚不存在,则将其添加到结果数组中,然后将其添加到哈希表中。如果它在哈希表中,则忽略它。

这是迄今为止最好的解决方案。那么为什么剩下的呢?因为像这样的问题是关于将您拥有(或应该拥有)的知识应用于问题,并根据您做出的假设将其改进为解决方案。改进解决方案并理解其背后的想法比反省解决方案有用得多。

此外,哈希表并不总是可用。以嵌入式系统或空间非常有限的系统为例。您可以用少量操作码实现快速排序,这比任何哈希表都少得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组删除重复元素 的相关文章

  • Java 如何知道如何迭代数组

    String strs new String 1 2 6 for String s strs System out println s 这是一个关于java内部的问题 在上面的代码示例中 foreach 循环如何计算出数组的长度 数组实际上
  • O(log n) 总是比 O(n) 快吗

    如果有 2 种算法以不同的复杂度计算相同的结果 O log n 总是会更快吗 如果是这样请解释一下 顺便说一句 这不是作业问题 不会 如果一种算法运行在N 100另一个在 log N 100 那么对于较小的输入大小 第二个将会较慢 渐近复杂
  • 查找邻接表中所有连接的节点

    我有一个 DAG 的邻接列表 我需要从所有节点中找到所有连接的节点 例如 对于下面的 DAG 1 gt 3 gt 4 2 gt 4 3 gt 2 4 gt 5 5 gt NULL 我需要这个 1 gt 2 3 4 5 2 gt 4 5 3
  • 拓扑排序卡恩算法 BFS 或 DFS

    拓扑排序的方法是BFS还是DFS 哪个正确 我认为BFS是对的 但有些网站说DFS 有些网站说BFS 我很困惑 卡恩算法与 BFS 或 DFS 相同吗 或者BFS 或DFS 只是卡恩算法的工具 Kahn算法和DFS在实践中都用于拓扑排序 选
  • 使用具有来自平面数字数组的最大和的子数组填充数组

    我需要填充一个数组 其中可能包含不确定数量的子数组 托盘 每个子数组的最大尺寸为 265 厘米 我有一个整数 包 的平面数组 需要在托盘中进行最佳排列 例如 50 厘米 45 厘米 30 厘米 如何动态创建一个系统来创建代表具有最佳空间优化
  • Deflate 压缩 - 数值示例

    我真的很想看看一个数字示例 手动压缩如何进行压缩 以下非常短的文本 abc 已使用 deflate 算法进行压缩 输出 eJxLTEoGAAJNASc 其二进制表示法为 01100101 01001010 01111000 01001100
  • 在php中循环多维数组并执行mysql插入(股票数据)

    我有一个多维数组 我希望循环遍历它并为数组中的值执行 mysql 数据库插入 我需要插入到 sql 查询中的数组值是 candles 0 complete candles 0 volume candles 0 mid h candles 0
  • C#,旋转二维数组

    我看过关于旋转二维数组的其他帖子 但这并不完全是我想要的 我想要这样的东西 int original new int 4 2 1 2 5 6 9 10 13 14 我想把它变成这样 旋转数组 1 5 9 13 2 6 10 14 我想按列而
  • 用 np.savez 存储字典会产生意想不到的结果?

    我可以使用 np savez 存储字典吗 结果令人惊讶 至少对我来说 而且我找不到通过密钥取回数据的方法 In 1 a 0 A array 1 2 3 B array 4 5 6 In 2 a Out 2 0 A array 1 2 3 B
  • 计算序列 1,3,8,22,60,164,448,1224... 的第 n 项? [复制]

    这个问题在这里已经有答案了 可能的重复 我想以 Order 1 或 nlogn 的顺序生成序列 1 3 8 22 60 164 的第 n 项 https stackoverflow com questions 11301992 i want
  • 将值插入php多维数组

    如何在 php 中将值插入多维数组 我需要使用 while 循环向数组添加越来越多的行 这是我的代码 size 10 p 0 while p lt size myarray array array number gt data p data
  • 在 React Native 中迭代 JSON

    我在本机反应中遇到了一个问题 我已经解析了一个大型 JSON 对象 并且需要迭代嵌套在其中的数组 我需要做的就是在每个项目对象中打印 day 0 的三个值 我的代码 import React Component PropTypes from
  • 哪种算法可以解决我的婚礼餐桌问题?

    我的婚礼有 x 位客人 有 y 张桌子 有 z 个座位 客人A可以与客人B同桌 客人C不能与客人D同桌 给定所有客人之间所有连接的数据集 是否有已知的算法可以解决此类问题 我确信这种问题有一个抽象的父问题 称为 问题 x 或其他问题 或者它
  • C 中每 N 个元素中出现次数最多的元素

    我有一个大小为 0 8388608 的大数组 A 其中包含 相对较小 的整数 A i 0 131072 我想找到每个 N 32 个元素中最常出现的元素 什么会更快 A 创建一个大小为131072的关联数组B 迭代32个元素 递增B A i
  • Rust 中删除单链表中的节点

    我是 Rust 新手 想用 Rust 编写链表来获得乐趣 我对如何删除链表中的节点感到困惑 这是我的简单代码 derive Debug struct Node v usize next Option
  • 如何理解javascript React中的这段代码

    我在网上找到了这个函数在js中的实现 这个函数递归地过滤一个对象数组 每个对象可能有属性 children 它是对象数组 并且对象也可能有孩子等等 该函数工作正常 但我有点不明白 这是我的功能 getFilteredArray array
  • 循环结束后从头开始重新迭代 for 循环 - JS

    我有一个数组和一个对象数组 我基本上需要将数组的第一个元素映射到数组内对象的第一个元素 依此类推 两个数组的长度都可以是可变的 并且一旦循环结束 循环应该从头开始 但是 我不确定是否再次开始循环 这是我的代码 const colors 7c
  • 如何使用 C 中的 Banker's Rounding 将 double 舍入为 int

    我想编写一个函数 使用银行家的舍入方法将双精度数舍入为整数 将一半舍入为偶数 http en wikipedia org wiki Rounding Round half to even http en wikipedia org wiki
  • 高效找到圆和网格的交点

    找到由圆心和半径定义的圆与任意网格的交点的好方法是什么 An illustration of the points I am trying to find 到目前为止我想到的可能的解决方案 找到位于中心 半径之间的所有线 对于每条线计算交点
  • JavaScript 在对象中创建数组并将数据推送到数组

    我是编程新手 我正在尝试 React 并具有函数 addComment 当用户向新闻添加评论时执行该函数 此时我需要创建一个属性comments 数组 并分配或推送到该数组输入评论值价值 但现在我只重写了数组的 0 个元素 无法添加新元素

随机推荐

  • != 运算符和文件流

    include
  • 使用 grunt 运行 Angular.js 时如何修复错误“请设置环境变量 CHROME_BIN”

    我正在尝试使用 AngularJS 进行单元测试 我已经安装了 Bower 和 grunt 所以我应该能够进行测试 但是 当我从终端 在我的例子中是 Git Bash 运行 grunt test 时 我收到错误 请设置环境变量 CHROME
  • .NET 垃圾收集器 - 它的线程优先级是什么?

    我发现了一些很棒的文章 Maoni 里克特 1 里氏 2 给出了关于 GC 的理论和实践的许多细节 但我找不到任何说明 GC 的线程优先级是如何设置的 我发现的最接近的是这个 它指出 Finalizer 线程 以高优先级与应用程序异步运行
  • 从 RecyclerView EditText 获取值?

    我对recyclerView感到震惊 这里的名称和余额字段来自两个不同的数组 我需要的是 这里每一行都有一个 EditText 字段 我需要访问每行上的每个 EditText 并从中获取值 并且总计显示在 Total textView 上
  • 在哪里可以找到适用于 32 位 Windows 的 JDK? [关闭]

    Closed 这个问题是无关 目前不接受答案 在我的一生中 我似乎找不到适用于 32 位 Windows 机器的 Java SE JDK 的工作版本 甲骨文把它放在哪里了 谢谢 内森 访问 Oracle 网站 您要查找的是 x86 而不是
  • 可观察的堆栈和队列

    我正在寻找一个INotifyCollectionChanged实施Stack and Queue 我可以自己动手 但我不想重新发明轮子 我遇到了同样的问题 想将我的解决方案分享给其他人 希望这对某人有帮助 public class Obse
  • 自动聚焦于 EditorFor

    我想在我的应用程序中自动聚焦于编辑器 但我似乎无法做到这一点 我已成功在文本框上使用自动对焦 但我想使用编辑器来保持应用程序的外观通用 任何对此问题的解决方案将不胜感激 谢谢 我的尝试 Html EditorFor model gt mod
  • 如何衡量休眠性能?

    如何衡量休眠状态下的性能 我想知道hibernate执行一个查询需要多少时间 JProfiler 7 1 有一个 JPA Hibernate 探针 http www ej technologies com products jprofile
  • 函数参数中的 PHP 标志是什么?

    我注意到 PHP 中的一些函数使用flags作为参数 是什么让它们独特而不是普通的字符串参数 我之所以这么问 是因为我想在自己的自定义函数上使用它们 但很好奇这样做的过程是什么 Edit 总结一下 什么时候最好创建带有标志的自定义函数以及什
  • 在 python 中将 OAuth2 与 gdata 上的服务帐户结合使用

    我想用data photos service PhotosService从 Picasa 推送和拉取照片 我从 Google 控制台获得了一个服务密钥文件 XXXXXXXX privatekey p12 现在正在尝试使用该密钥对 googl
  • 为什么将数组添加到 number 会返回字符串? [复制]

    这个问题在这里已经有答案了 var array 1 2 4 array 1 gives 1 2 41 谁能解释这种行为 谁能解释这种行为 这个答案试图解释这种行为从规格的角度来看 As per spec 在运行时评估期间 两个表达式 左和右
  • HMACSHA1.ComputeHash() 线程安全问题

    我问自己 在 ASP NET 页面的代码隐藏中使用包含 HMACSHA1 实例的静态 共享 变量是否会很危险 问题是 在同一 ASP NET 页面上处理多个同时请求时 所有 ASP NET 工作进程线程将使用相同的 HMACSHA1 实例
  • Mysql计数频率

    我检查过类似的问题 但它对我的精确问题没有帮助 所以 我的桌子是这样的 id age 1 30 2 36 3 30 4 52 5 52 6 30 7 36 etc 我需要计算年龄的频率 age freq 30 2 36 3 52 2 我怎样
  • 如何使用 Jacoco 和多个模块在 Jenkins 中实现代码覆盖率?

    我的代码结构如下 events消息其他代码功能测试 在 jacoco 的构建脚本中 首先它必须复制所有类并使用该类目录来运行该工具 您能否在此处描述目标目录的步骤 我的意思是如何提及运行代码覆盖率的目录 构建后 每个文件夹都有自己的目标文件
  • 从 NSArray 获取 NSIndexSet

    NSArray 有一些有用的方法来查找指定索引的对象 To find objects by indexes id objectAtIndex NSUInteger index NSArray objectsAtIndexes NSIndex
  • UITextInputMode.activeInputModes() 在 Swift 2 中崩溃

    我想在 Swift 2 中获得 UITextInputMode 但是UITextInputMode activeInputModes 崩溃 let x UITextInputMode activeInputModes crash here
  • OpenERP fields.function() 解释[重复]

    这个问题在这里已经有答案了 我从 stock py 文件和行号 163 中获取了此代码 complete name fields function complete name type char size 256 string Locati
  • 如果每个列表视图有多个文本视图,如何设置适配器?

    我有多个TextViewmy 中的每个列表项ListView 我学会了写一个正确的getView我相信的方法 但我不知道如何使用setAdapter调用该方法 private static String project proj1 proj
  • 单击时删除 html 图像上的蓝色突出显示

    我正在 Android 中制作一个自定义应用程序 我正在显示一个 html 页面 div 内有一个 img 标签 div class press img src but png width 150 height 62 border 0 di
  • 数组删除重复元素

    我有一个未排序的数组 删除元素 如果存在 的所有重复项的最佳方法是什么 e g a 1 5 2 6 8 9 1 1 10 3 2 4 1 3 11 3 所以在该操作之后数组应该看起来像 a 1 5 2 6 8 9 10 3 4 11 检查每