给定一个整数数组,找到第一个唯一的整数

2024-01-18

给定一个整数数组,找到第一个唯一的整数。

我的解决方案:使用std::map

将整数(数字作为键,其索引作为值)一一放入其中(O(n^2 lgn)),如果有重复,则从地图中删除该条目(O(lg n)),将所有数字放入映射后,迭代映射并找到索引最小 O(n) 的键。

O(n^2 lgn)因为map需要做排序。

这效率不高。

其他更好的解决方案?


我相信以下将是最佳解决方案,至少基于时间/空间复杂度:

步骤1: 将整数存储在哈希映射中,该映射将整数作为键,并将其出现的次数作为值。这通常是一个O(n)平均而言,哈希表中元素的操作和插入/更新应该是恒定时间。如果发现一个整数出现两次以上,您实际上不必进一步增加使用计数(如果您不想)。

第2步: 对整数执行第二次传递。在哈希映射中查找每个,第一个出现次数为 1 的就是您要查找的那个(即第一个出现的整数)。这也是O(n),使得整个过程O(n).

针对特殊情况的一些可能的优化:

优化A:可以使用简单的数组来代替哈希表。即使在最坏的情况下,这也保证了 O(1),用于计算特定整数的出现次数以及查找其出现计数。此外,这还增强了实时性能,因为不需要执行哈希算法。由于引用局部性可能较差(即较大的稀疏表与具有合理负载因子的哈希表实现),可能会出现命中。然而,这适用于整数排序的非常特殊的情况,并且可以通过哈希表的哈希函数根据传入的整数生成伪随机存储桶放置来缓解(即,一开始引用的位置较差)。

数组中的每个字节都表示该字节索引所表示的整数的计数(最多 255)。只有当最低整数和最高整数之间的差异(即有效整数域的基数)足够小以使该数组适合内存时,这才是可能的。特定整数数组中的索引将是其值减去数据集中存在的最小整数。

例如,在具有 64 位操作系统的现代硬件上,可以想象可以分配一个 4GB 的数组来处理整个 32 位整数域。如果有足够的内存,甚至可以想象更大的阵列。

在处理之前必须知道最小和最大整数,或者需要使用最小最大算法对数据进行另一次线性遍历以找出该信息。

优化B:你可以优化优化A此外,每个整数最多使用 2 位(一位表示存在,另一位表示多重)。这将允许每个字节表示四个整数,从而扩展数组实现以在给定的可用内存量下处理更大的整数域。可以在这里玩更多的位游戏来进一步压缩表示,但它们仅支持传入数据的特殊情况,因此不能推荐用于仍然主要是一般的情况。

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

给定一个整数数组,找到第一个唯一的整数 的相关文章

随机推荐

  • CoTURN:如何使用 TURN REST API?

    我已经构建了 coturn 并成功运行它 ip 192 168 1 111 现在我面临的问题是通过REST API获取Turn凭证 https datatracker ietf org doc html draft uberti behav
  • 这是使用异常的正确方法吗?

    我有一个会员例外 如下所示 public enum MembershipError EmailNotFound EmailNotConfirmed IncorrectPassword EmailExists public class Mem
  • 如何设置本地环境以使用 Chrome 的最新 SameSite cookie 更改?

    我正在使用 ReactJS 构建一个应用程序 并且随着 Chrome 的最新更改 我们无法取回 cookie 因为它是由中央身份验证服务提供的 当然 在产品中它将与 JS 应用程序具有相同的域 但目前它正在本地破坏该应用程序 我知道关于Sa
  • 当 UILabel 文本属性设置为 nil 或“”时,会使 UILabel 从视图中消失(Swift / Autolayout / iOS9.1)

    我正在学习斯坦福 2015 年冬季 Swift iOS 课程 在做作业时 我遇到了一个我想改变的行为 我使用视频中描述的自动布局 使显示引脚指向前视图边缘和后视图边缘 并且计算器应用程序 显示 UILabel 可以使用初始值为 0 的值 并
  • 如何在 sqlalchemy 中查询类内部

    我有一个与 Item 类具有一对多关系的 User 类 class User Base items relationship Item def method self for item in self items if self items
  • 用于解压缩的免费 JPEG2000 库或 SDK [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C# Windows 无法在顶部打开

    我编写了一个相对较大的应用程序 其中有很多对话框和表单等 我用以下命令打开它们Form ShowDialog 很多时候 表单在现有窗口后面打开 例如昨天 我在一台打开了其他几个程序的机器上测试它 许多 Windows 资源管理器窗口 一些
  • 学说 2 多对多(产品 - 类别)

    您好 我在项目 产品 和类别之间有多对多的关系 我使用这三个实体实现 项目实体 Entity Table name items use Doctrine Common Collections ArrayCollection class It
  • Node.js require() 与 RequireJS?

    你好 使用 RequireJS 我可以设置这样的基本路径 base app 所以当我在 app foo bar 例如 我有一个使用的脚本require foo 然后 RequireJS 会搜索 app foo js并且不在node modu
  • 分割空格分隔的字符串

    String numbers 5 1 5 1 那么 是不是 String splitNumbers numbers split or String splitNumbers numbers split s 寻找 5 1 5 1 知道为什么两
  • 如何在maven中保护和加密setting.xml密码文件?

    如何保护 maven 中 settings xml 中的服务器 代理设置 我认为这主要是关于存储在那里的登录名和密码 并且我认为这些不能明确地放置在那里 它们应该存储在环境变量 等中吗 安全settings xml 的示例应该是什么样子 您
  • 获取存储库中的所有文件夹和文档 Alfresco Restful

    我正在学习露天 我想使用 Restful API 获取存储库中的所有文件夹和文档 我怎样才能做到这一点 网页脚本是构建您自己的 API 的好方法 但在这种情况下 您应该可以使用 Alfresco 为您提供的 OOTB 内置 API 您可以使
  • MVC 与区域 - Html.ActionLink 返回错误的 URL/路线?

    我正在使用 MVC3 并在我的应用程序中有区域 一般来说 一切正常 我可以导航到我的区域 例如 Admin Area Controller Department 如下所示 然而 我注意到 如果我没有在 ActionLink 中指定区域 例如
  • 在循环内增加时间 15 分钟[重复]

    这个问题在这里已经有答案了 我想创建一个下拉菜单 它将当前时间作为开始时间 直到 24 小时为止 就像直到 24 小时之前 所以在这之间它将显示每 15 分钟增量的时间 问题是 当我尝试运行循环时 起始时间还可以 但在下一个循环中 时间会跳
  • 使用apache服务器时覆盖python3默认编码器

    我正在运行一个 apache 服务器 它服务于一个名为巧妙 http inginious readthedocs io Getting UnicodeDecodeError ascii 读取带有希伯来字符的文件时 我读到您可以使用环境变量更
  • 如何在Client中获取socket.io客户端的session id

    我想在我的 socket io 客户端中获取客户端的会话 ID 这是我的 socket io 客户端 var socket new io Socket config host port config port rememberTranspo
  • Google App Engine app.yaml 中的反向skip_files

    我目前有以下内容skip files在我的 app yaml 中 skip files json yaml Gruntfile js bower components node modules src tests tmp 这实在是太臃肿了
  • Ruby 中的“<<-”是什么意思?

    例如 code lt lt EOH bundle install bundle exec unicorn c etc unicorn cfg D EOH 这段代码有什么作用 什么是 lt lt called 它被称为定界符 定义多行字符串的
  • 在 CATextLayer 中显示属性字符串

    我有一个简单的示例应用程序 我在其中创建了一个CATextLayer并设置其string财产给NSAttributedString 然后我将该 CATextLayer 添加到视图中 import
  • 给定一个整数数组,找到第一个唯一的整数

    给定一个整数数组 找到第一个唯一的整数 我的解决方案 使用std map 将整数 数字作为键 其索引作为值 一一放入其中 O n 2 lgn 如果有重复 则从地图中删除该条目 O lg n 将所有数字放入映射后 迭代映射并找到索引最小 O