【问题标题】:How to find an unknown integer如何找到一个未知的整数
【发布时间】:2021-02-27 21:22:00
【问题描述】:

我正在寻找一种有效的算法来找到一个未知整数,给定一个函数来告诉我它是否在给定的闭区间内。即,我正在寻找此签名的实现:

fun findInt(isInClosedInterval: (Pair<Int,Int>) -> Boolean): Int

我自己可能会想出一个算法,但我猜想已经存在一个算法,我不想重新发明轮子。如果您能指出 Java 平台上库中的函数,那将是理想的,但也可以仅提供算法或数学函数的名称。

我在想一个涉及二分查找的解决方案,但它似乎只适用于你想找到一个已知元素的位置,而我的元素(整数)是未知的。

【问题讨论】:

  • 一个比二分搜索更合适的关键字,恕我直言,exponential search 因为您可能需要先初始化一些保证包含间隔。然后它可能只是简单地在每一半上分支,直到一半是单例。

标签: algorithm search


【解决方案1】:

如果我跟随,您正在寻找一种找到随机整数的算法?

我不知道库中有哪一个,但构建它以使其尽可能快的最佳方法是遵循此处的示例。它解释了为什么这种方法有效。 https://www.khanacademy.org/computing/computer-science/algorithms/intro-to-algorithms/a/a-guessing-game

如果您正在寻找更精确的解决方案,我建议您提供有关您正在尝试做的事情的更多详细信息。

【讨论】:

  • 正确。在原始问题中,我对随机数有一点了解,但我不想使我的问题复杂化。无论如何:这个数字可能在零附近的几百个范围内,但是 isInClosedInterval() 非常昂贵,所以线性搜索实际上仍然是不可能的。
【解决方案2】:

由于在库中找不到实现,我自己创建了一个。它可以在多平台库kotlin-lib 的包com.marcoeckstein.klib.algorithm 中找到。与我的问题相反,我稍微更改了签名:

fun findNumber(isNumberInRange: (IntRange) -> Boolean): Int?

这些单元测试演示了如何使用它:

@Test
fun findNumber_finds_number() {
    TestData.integers.forAll { number ->
        findNumber { it.contains(number) } shouldBe number
    }
}

@Test
fun findNumber_returns_null_when_there_is_no_number() {
    findNumber { false } shouldBe null
}

我认为我在实现中所做的是sascha 在他的评论中提到的指数搜索。至少想法是一样的,虽然我不确定它是否完全符合指数搜索的定义。

我还找到了我正在寻找的二进制搜索的实现,它不需要您明确给出要搜索的元素。它在 Kotlin 标准库中,我之前忽略了它。

public fun <T> List<T>.binarySearch(
    fromIndex: Int = 0, 
    toIndex: Int = size, 
    comparison: (T) -> Int // Implicitly specifies the element to be found.
                           // Returns 1, -1 or 0.
): Int 

但我无法将它用于我的问题,因为它适用于列表,并且要查找任意整数,我需要一个包含每个整数的列表,这导致需要多个 GB 的堆空间。所以我实现了一个可以在IntRange 上工作的二进制搜索,它也可以从新库中使用。

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2011-05-02
    • 2014-05-11
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多