【问题标题】:traversing numbers in an interval wisely明智地在区间内遍历数字
【发布时间】:2012-09-27 23:10:50
【问题描述】:

我想明智地扫描大间隔的数字,直到找到我需要的数字。 但是,我不知道这个数字可能在哪里,在搜索过程中我也不会有任何线索。

让我举个例子,以便于陈述我的问题

假设我正在搜索一个介于 100000000000000 和 999999999999999 之间的数字

幼稚的方法将从 100000000000000 开始,然后逐个计数到 99...。 但这是不明智的,因为如果我不走运,号码可能在远端。

那么,解决这个问题的最佳方法是什么。我不是在寻找数学上最好的,我需要一种在 C 编程语言中易于实现的技术。

提前致谢。

【问题讨论】:

  • 你怎么知道你是否找到了你需要的那个?您是在搜索范围内的所有数字,还是仅搜索一些?如果只是一些,它们是否已排序?
  • 我正在寻找可能为数不多的数字之一。我有一个通过 brutforce 方法解决 PCP 问题的测试器功能,这就是它们无法排序的原因。

标签: c performance algorithm search counting


【解决方案1】:

如您所知,没有提高搜索速度的策略。您所能做的就是通过使用多线程来加速搜索本身。因此,技术上最好的方法可能是尝试在OpenCL 中实现算法(这与 C 非常相似,可以通过 C 库使用)并并行运行数百个测试,具体取决于您的硬件 (GPU)。

【讨论】:

    【解决方案2】:

    你的问题没有解决办法,只有知识。如果您对数字一无所知,那么枚举它们的任何策略都同样好(或坏)。

    如果您认为自己正在与试图为您隐藏数字的对手作战,那么策略就是让您的下一步行动变得不可猜测。那将是随机选择范围内的数字并要求它们。 (为避免重复,您必须使用数字的随机排列。)然后您会找到预期数字约为总数一半的数字,也就是说,您将从最坏的情况。但正如所说,所有这些都取决于您可以做出的假设。

    【讨论】:

    • 是的,这是真的,这个问题根本没有解决方案。但是,我说,我正在寻找不一定是正确解决方案的最佳方法。例如,如果一个人开始从最小间隔数到最大间隔数,这不是比同时从最小到最大和最大到最小数或将间隔分成小块并同时再次寻找每个小块的更好方法利用多线程。
    • 正如 Jens 所说,任何策略都同样好/坏。除非您有多个处理器,否则多线程将无济于事——如果您这样做了,您显然可以将问题分解为 n 个较小的问题。
    【解决方案3】:

    使用二分搜索。首先看看你的数字是高于还是低于范围的中间。根据答案,分别对范围的上半部分或下半部分重复该过程。

    【讨论】:

    • 但问题是没有办法确定它是否低于范围。
    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2022-01-16
    • 2022-06-10
    • 2021-08-24
    • 2011-03-23
    相关资源
    最近更新 更多