当前位置: 首页 > 知识库问答 >
问题:

这个问题的最有效算法

莫宝
2023-03-14

我已经提出了几个解决方案,但我认为它们的效率不高,而且我很难计算它们的复杂性。

计划A)对于我随机选择的[1,N]范围内的每一个整数,我检查它是否被占用。如果是,我重新滚动直到我得到一个未被占用的整数。这对于N的高阶数来说变得低效,因为碰撞非常高。

计划B)每次迭代时,我遍历数组的所有值,那些我没有占用的我会写在一个列表中。之后,我洗牌列表(例如通过Fisher-Yates shuffle?)并任意获得第一个对象。这不是空间效率,对于我的问题,我不能只保留一个列表并从那里洗牌,因为在我的程序中可能有多个线程计算这个。

计划C)计划A的一点变化:我在[1,N]范围内随机选择,我检查它是否被占用。如果是,我+1并尝试下一个,如果是,再次+1。最坏的情况是所有数组插槽都被占用,除了一个->O(N)。

有没有更好的办法来解决这个问题?这个具体的问题是我的软件中一个非常重要的模块,所以时间复杂度是至关重要的。如果没有,你认为我应该选择哪种方式(对于那些有计算时间复杂度天赋的人)。谢谢你!

共有1个答案

宗政财
2023-03-14

我建议你同时采用A和B两种方案。

使用,直到数组大部分填充完毕。然后搜索未使用的索引,将它们放入一个数组,并使用计划B。您必须对您的约束进行试验,以确定何时切换。

但是,您关于多线程执行此操作的评论是令人关切的。请注意,当多个线程访问同一内存时,竞争情况很容易发生,争用访问权限会减慢您的速度。

 类似资料:
  • 这是个掷硬币游戏。你投了一些钱,如果你投的是硬币的头,你赚的钱是你投的钱的两倍,如果它的尾,你全输了 什么才是不破产和最大收益的最佳策略? 你可以想扔多少次就扔多少次,硬币是不偏的

  • 我在看麻省理工学院的开放课件的第一次讲座,关于算法的介绍,有一些东西对我来说并不是很明显。你不能在这里观看24:30的讲座和课堂讲稿,这里有一维峰值问题的定义和解决方案的所有细节 问题是: 对于由“n”个整数元素组成的数组,找到一个峰值 我的问题/担心 既然在中有上述条件,为什么要往左走?而不是右边? 既然在中有上述条件,为什么要往右边走?而不是左边? 二进制搜索算法假设我们从排序的数组开始,那么

  • 问题内容: 我已经为Employee类的父类是抽象的并且父类中的clone()方法是抽象的编写了此克隆方法。我想用此代码复制Employee对象的原始数据类型,而不是复制每个原始数据单独键入,但是此代码在我调用clone()方法的行中有问题。(此代码在Employee类中) 错误是:来自对象类型的方法clone()不可见。 但是我的Employee类在类层次结构中,可以访问Object类中受保护的

  • Object[ ] arr = (Object[ ]) object ; 还可以这样写 ? 怎么可以把一个东西 变成数组 ? 一变多 ?

  • 我有一个关于书库的问题...我想写一个有3个堆栈的程序,我想在每个堆栈上添加这些操作(我应该使用数组): 1.创建堆栈2。按3号。流行音乐4号。显示每个堆栈的顶部 我写的程序,但我遇到了这些错误: 错误4错误LNK2019:未解析的外部符号“public:int\u thiscall stack::IsFull2(void)”(?IsFull2@stack@@QAEHXZ)在函数“public:v

  • 机器人可以走三种不同长度的步:1厘米、2厘米、3厘米。编写一个递归算法,找出机器人可以通过的不同方式的数量“d”