小编典典

高效的算法来查找第一个可用名称

algorithm

我有一个包含项目名称的数组。我想为用户提供创建项目的选项,而无需指定其名称,因此我的程序必须提供唯一的默认名称,例如“ Item 1”。

挑战在于名称必须唯一,因此我必须检查所有数组以获取该默认名称,如果有一个具有相同名称的项目,我必须将名称更改为“ Item
2”,依此类推,直到我查找可用的名称。

显而易见的解决方案将是这样的:

String name = "Item ";
for (int i = 0; !isAvailable(name + i) ; i++);

我对该算法的问题是它运行在O(N ^ 2)。

我想知道是否存在已知(或新的)更有效的算法来解决这种情况。

换句话说,我的问题是:是否有任何算法可以找到第一个大于零的数字,该数字在给定数组中不存在,并且以小于N ^ 2的速度运行?


阅读 281

收藏
2020-07-28

共1个答案

小编典典

您当然可以在O(N)时间内完成操作,N是数组中的项目数:

  • “项目1”,“项目2”,…“项目N + 1”之一必须是自由的,因此创建N + 1个标志的数组。
  • 遍历所有项目,并为每个名称(如果其形式为“项目k”且0 <k <= N + 1)设置该标志。
  • 扫描标志数组以查找第一个清除标志。

额外的内存需求是N + 1位,这肯定会击败实际上存储所有N个名称的任何数据结构。

2020-07-28