Python 3.x 算法和运行时分析

Python 3.x 算法和运行时分析,python-3.x,algorithm,data-structures,runtime,Python 3.x,Algorithm,Data Structures,Runtime,包含两个示例的文件是一个禁止的数字间隔列表。包含例如12-18的行表示禁止所有数字12到18。间隔可能重叠。 我们想知道最小数量是多少。 使用变量分析运行时不一定需要所有变量: •N:最大而非最大允许数量;所以数字在0到N之间 •K:文件中的间隔数 •M:最大间隔的宽度 有一个明显的方法可以解决这个问题:我们检查所有的数字,直到遇到允许的最小值。 •这种算法有多快 你可以想象另一个简单的算法,使用N字节或内存位。 提示:删除线。 •用文字描述。例如,您可以自己指定一些数字介于0和20之间的间隔,

包含两个示例的文件是一个禁止的数字间隔列表。包含例如12-18的行表示禁止所有数字12到18。间隔可能重叠。 我们想知道最小数量是多少。 使用变量分析运行时不一定需要所有变量:

•N:最大而非最大允许数量;所以数字在0到N之间

•K:文件中的间隔数

•M:最大间隔的宽度

有一个明显的方法可以解决这个问题:我们检查所有的数字,直到遇到允许的最小值。 •这种算法有多快

你可以想象另一个简单的算法,使用N字节或内存位。 提示:删除线。 •用文字描述。例如,您可以自己指定一些数字介于0和20之间的间隔,并在这些间隔上显示算法。然而,它也起草了一个一般性的描述。 •该算法有多快?思考时,如果需要,请使用N、K和M

C.使不消耗额外内存的算法更准确:内存消耗应独立于N、K和M,但比A点下的算法更快。 •描述它。 •速度有多快?它比B算法快吗

现在我们感兴趣的是在0和N之间允许多少个数字。您将如何调整上述算法来解决这个问题?他们的费率会发生什么变化

file = "0-19.txt"
intervals = [tuple(map(int, v.split("-"))) for v in open(file)]
#example# intervals = [(12, 18), (2, 5), (3, 8), (0, 4), (15, 19), (6, 9), (13, 17), (4, 8)]#
我目前的代码只是执行程序,但我还没有找到更好的代码算法,仍然需要大量的工作才能理解,我需要一个快速解决方案代码/算法,用于示例a、B和C,可能还有D。然后我可以自己研究时间分析。谢谢你的帮助

def generator_intervala(start, stop, step):
    forbidden_numbers = set()
    while start <= stop:
        forbidden_numbers.add(start)
        start += step
    return (forbidden_numbers)


mnozica = set()
for interval in intervals:
    a, b = interval
    values = (generator_intervala(a, b, 1))
    for i in values:
        mnozica.add(i)



allowed_numbers = set()
N = max(mnozica)
for i in range(N):
    if i not in mnozica:
        allowed_numbers.add(i)




print(intervals)
print(mnozica)
print(min(allowed_numbers))
print(max(mnozica))

Output:

[(12, 18), (2, 5), (3, 8), (0, 4), (15, 19), (6, 9), (13, 17), (4, 8)]
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19}
10
19

您的set方法不必要地复杂:

N = 100
ranges = [(12, 18), (2, 5), (3, 8), (0, 4), (15, 19), (6, 9), (13, 17), (4, 8)]

do_not_use = set()

for (a,b) in ranges: 
    do_not_use.update(range(a,b+1))          

print(do_not_use)  

print( min(a for a in range(N+1) if a not in do_not_use))
这就是所需要的一切。输出:

set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19])
10
这与N无关,只是取决于范围内有多少个数字

在一个集合中只存储禁止的数字需要O1进行检查,在一个范围内使用最小构建以获得最小值

如果您先对元组进行排序,然后对元组进行迭代,直到找到第一个间隙,使排序为ΘN log N,然后搜索为ΘN,则可以加快速度:

def findme():
    ranges = [(12, 18), (2, 5), (3, 8), (0, 4), (15, 19), (6, 9), (13, 17), (4, 8)]
    ranges.sort()  # inplace sort, no additional space requirements
    if ranges[0][0]>0: 
        return 0

    for ((a_min,a_max),(b_min,b_max)) in zip(ranges,ranges[1:]):
        if a_max < b_min-1:
            return a_max+1

    return ranges[-1][1]+1  # might give you N+1 if no solution in 0-N exists
输出:

yours 1.3931225209998956
mine 1.263602267999886
findme 0.1711935210005322

对于示例A、B、C和D,我需要完整的指导和解决方案,这是一个完全错误的地方来要求这样的东西。我不需要你的偏见,如果你帮不上忙,那么就不要回答。实际上我不需要指导,一些更好的算法/更快的解决方案也可以。我可以自己研究并计算。如果你能做到这一点也可以。我更正了标签和我的要求。要求?:你认为这个网站是做什么的?提示:你或任何人都不能向别人提出要求。
yours 1.3931225209998956
mine 1.263602267999886
findme 0.1711935210005322