Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找和介于1和2之间的对_Algorithm - Fatal编程技术网

Algorithm 查找和介于1和2之间的对

Algorithm 查找和介于1和2之间的对,algorithm,Algorithm,给定n正实数时,任务是对以下问题给出是或否的答案: “是否存在一对数字x和y,使得1只有0和2之间的数字才有助于参与赢家配对。其他数字可以忽略。” 每个这样的数字x都可以从1-x和2-x之间的列表中创建一个额外的数字对。 在浏览列表时计算并维护可接受的边界。在任何给定时间,可接受的下一个值的间隔不能超过两个,因为所有可接受的下一个值的间隔都包含在-1和2之间,且宽度为1。因此,完成一对的可接受下一个值可以用常量表示空间 当列表中出现的数字在最多两个可接受的下一个值的间隔内时,请回答“是”。如果到

给定n正实数时,任务是对以下问题给出是或否的答案:
“是否存在一对数字x和y,使得1只有0和2之间的数字才有助于参与赢家配对。其他数字可以忽略。”

每个这样的数字
x
都可以从
1-x
2-x
之间的列表中创建一个额外的数字对。 在浏览列表时计算并维护可接受的边界。在任何给定时间,可接受的下一个值的间隔不能超过两个,因为所有可接受的下一个值的间隔都包含在-1和2之间,且宽度为1。因此,完成一对的可接受下一个值可以用常量表示空间

当列表中出现的数字在最多两个可接受的下一个值的间隔内时,请回答“是”。如果到达列表末尾时没有遇到这种情况,请回答“否”

示例:0.1、0.5、2.0

  • 启动时,可以显示并完成一对的值集为空集

  • 在读取0.1之后,如果现在出现,则完成一对的值集为[0.9,1.9]

  • 0.5不属于可以完成一对的值集。但是,读取后,[0.5,1.5]中的值可以完成一对。因为我们已经有了集合[0.9,1.9],可以完成一对的新值集是[0.5,1.9]

  • 2.0不属于可以完成一对的值集。但是,我们现在可以读取[-1,0]中的任何值来完成一对。此后,可以读取以完成一对的新值集是[-1,0]∪ [0.5,1.9]

  • 等等…


我喜欢Pascal Cuoq的算法解决这个问题,我认为这是一个很好且优雅的解决方案。我想在这里发布一种不同的方法,从稍微不同的角度来看待这个解决方案

首先,这里是算法:

  • 对输入进行一次遍历,并跟踪以下内容:1到2之间的最小数字、小于1的最小数字、小于1/2的最大数字以及1/2到1之间的数字
  • 如果介于1和2之间的最小数字与小于1的最小数字之和小于2,则输出YES
  • 否则,如果在1/2和1之间至少有两个数字,则输出YES
  • 否则,如果1/2和1之间没有数字,则输出no
  • 否则,如果数组中小于1/2的最大数与介于1/2和1之间的唯一数之和大于1,则输出YES
  • 否则,输出NO
  • 这是一个证明。正如帕斯卡所指出的,我们只关心[0,2]范围内的数字;这个范围之外的任何东西都不能是1到2之间的总和的一部分。我们可以做一个案例分析来思考总和中可能的数字

    首先,其中一个数字可能在范围(1,2)内。此范围内不能有两个数字,因此另一个数字必须在范围[0,1]内。在这种情况下,我们可以取范围[0,1]内的最小数字,然后查看将其与范围(1,2)内的最小数字相加时会发生什么情况:如果它们的总和在1和2之间,则我们完成了;否则,涉及范围(1,2)内的数字的总和不能成为总和的一部分

    否则,求和必须完全由[0,1]范围内的数字组成。请注意,至少有一个数字必须在[1/2,1]范围内,因为否则它们的和不能至少为1。还要注意,此范围内任何两个数字的和永远不会超过2。在这种情况下,如果[1/2,1]范围内有两个数字,它们的和满足条件,我们完成了。如果[1/2,1]范围内有0个数字,则没有解决方案。否则,我们可以尝试将[0,1/2]范围内的最大数字与[1/2,1]范围内的一个数字相加,看看和是否至少为1。如果答案为是,则我们得到了一对;如果不是,则答案为否

    我当然更喜欢Pascal的算法而不是这个,但我想我会发布这个来展示如何在这里使用案例分析


    希望这有帮助!

    实数是保证非负数,还是可以同时有正数和负数?只有正数。散列所有数字,并检查每个数字是否存在1-x或-x或2-x。我想这可能是重复的,因为我记得在堆栈交换的其他地方读过这个问题的答案。我更喜欢如果我能找到它的副本,就不回答这个问题,但我似乎找不到原始的。我想同样的解决方案也可以扩展到这种情况,将(0,1]作为一个范围,将(1,2)作为一个范围我们不能有第二个范围内的两个数字。我们可以有第一个范围内的一个数字和第二个范围内的一个数字。第一个范围内的两个数字也是可能的。希望这能有所帮助。@BhootI不知道为什么这在线性时间和恒定空间内有效。你能详细说明吗?@templatetypedef在值列表上只有一个线性传递。在每一步,该算法测试新值是否可用于完成一对(恒定时间)并将新值合并到下一步开始的可接受值表示中,这也需要恒定的时间。完成一对可接受值集的最复杂表示形式为两个间隔,占用恒定的空间。请注意,如问题主体中所述,该问题只需要“是或否”回答。@templatetypedef但是,也可以在恒定的空间和线性时间内生成获胜的一对。当找到该对的第二个值
    y
    时,第一个值已被忘记,就足以再次扫描列表以查找它(即,查找一个数字
    x
    ,以便
    1≤ x+y≤ 2.