O(1)用于查找数字的最大兄弟姐妹的时间复杂度解决方案

时间:2014-11-04 16:40:31

标签: c complexity-theory

我有一个问题,我必须从给定数字的数字集中找到最大的兄弟姐妹。例如,123的兄弟是123,213,321,312,132,312,231。其中最大的是321。

这也可以使用数组来完成。

实施1。

  1. 提取单个元素并在数组中填充
  2. 反向排序。
  3. 合并所有元素
  4. 实施2。

    1. 提取单个元素并在数组中填充
    2. 堆栈中的第一个元素
    3. 遍历数组并将数组元素推入堆栈,使最大元素位于堆栈顶部。
    4. 但是这也消耗了O(n),因为我需要遍历整个堆栈。

      欢迎任何最佳解决方案。

3 个答案:

答案 0 :(得分:1)

任何解决方案都需要对数字的数字进行排序。比较排序为O(n log n),其中n是要排序的对象数,但由于数字是一组受限制的元素,因此您可以使用计数排序来实现O(n)

搜索互联网(或算法设计的任何基础教科书)应该很容易获得更多细节,但这里有几个维基百科链接可以帮助您入门:

答案 1 :(得分:0)

我建议使用一种能让效果接近O(1)的替代方案:

在解析数字(提取小数或其他组件)时,只需在结果位掩码中设置位,其大小等于基数(如果是小数,则为10)。

设置完所有位后,您可以查找位设置并创建输出。

虽然算法的任何部分都不是O(1),但在实践中,您可能会认为它接近于此。有些平台有汇编指令,可以帮助解决问题。

答案 2 :(得分:0)

如果不允许重复数字,则有一个O(1)解决方案,因为列表的长度有一个上限。为什么?因为有一定数量的数字字符,所以列表的长度超过了鸽子校长的数字字符数。

请注意,当且仅当列表的长度存在上限时,才会有一个O(1)解决方案。

证明:
如果列表的长度存在上限,则存在有限数量的可能输入。解析任何输入将花费有限的时间,并且有限多个有限值的最大值将仅是常数。不同的算法可能会改变常数,但假设您只考虑正确的算法,每个算法仍然会在一定时间限制的时间内完成。

相反,如果所需时间是O(1),则需要考虑多少位数的上限。由于只需要考虑有限数量的数字,因此在列表长度上必须有一个上限,否则,您无法确定列表中有多少9个。

假设列表的长度没有上限(因此,允许重复),最好的办法是计算所需的每个数字的数量,然后显示按重复顺序排列数字的数字。