【问题标题】:How to create another array set that guarantees prediction如何创建另一个保证预测的数组集
【发布时间】:2021-12-31 13:03:06
【问题描述】:
  Card#0           Card#1            Card#2         Card#3           Card#4
1, 3,  5,  7      2, 3, 6, 7     4, 5, 6, 7     8, 9, 10,11      16, 17, 18, 19
9, 11, 13, 15    10,11,14,15     12,13,14,15    12,13,14,15      20, 21, 22, 23
17, 19, 21, 23   18,19,22,23     20,21,22,23    24,25,26,27      24, 25, 26, 27
25, 27, 29, 31    26,27,30,31   28,29,30,31    28,29,30,31      28, 29, 30, 31

这可以预测 1 到 31 之间的任何数字。所以它可以通过告诉程序员自己你的数字出现在哪些卡片上来预测你的生日。你取卡片的第一个数字,然后添加卡片上出现的第一个数字。
例如:

我选择的数字是 27。#27 出现在卡片 #0、1、3、4 上。每张卡片上出现的相应第一个数字将是#1 + 2 + 8 + 16 = 27

通过了解这种算法,我相信我们看到了一个 log(n) 算法正在使用,因为它将代码分成两半并完成了大约 2-3 个函数。

我的问题是如何通过增加参数号来扩展这个数组集,以创建更多可以完美排序的数组集,并且会产生比 #4 多的额外卡片。换句话说,我怎样才能使这个代码预测参数更宽并且仍然执行 O(log(n) 线性。

【问题讨论】:

    标签: python arrays algorithm validation


    【解决方案1】:

    这种工作方式实际上只是二进制编码。如果 nth 位(从右侧)打开,则卡上存在一个数字 n

    例如,19 = 100112,所以它会显示在卡片 0、1 和 4 上。

    因此,如果你想让这个系统适用于数字1..n,你只需要卡片的数量等于n的位数。然后,在每张卡片上,只包含所有翻转该位的数字。

    这是一个演示,但请花点时间考虑如何先实现它,然后设法理解我的代码,而不是复制它:

    n = int(input())
    digits = len(bin(n)) - 2
    
    def get_card(place):
    	card = []
    	for x in range(1, n + 1):
    		if x & (1 << place):
    			card.append(x)
    	return card
    
    for x in range(digits):
    	print(f"Card {x + 1}:", get_card(x))
    

    Try it online!

    我注意到您还提到了时间复杂度限制。我还没有检查我的代码是否符合这一点——我的目标纯粹是为了演示这可能是什么样子——可能有一种更有效的方法来获取所有数字的列表并打开该位(尽管,我想这实际上是O(n log n),但我不确定)。

    【讨论】:

    • 感谢您的存在和分享。
    猜你喜欢
    • 2016-11-01
    • 2019-09-03
    • 1970-01-01
    • 2020-09-07
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    相关资源
    最近更新 更多