Python 按O(n)的顺序更改字典中的项目范围

Python 按O(n)的顺序更改字典中的项目范围,python,Python,我试图在运行时O(n)更改字典中的一系列值。 其中n是我需要更改的范围内的元素数 例如,如果我的字典中有键的编号,我会得到一系列键的列表 列表=[(键1,键3),(键2,键3)] 在这种情况下,如果我从 d={key1:奇数,key2:偶数,key3:奇数,key4:偶数} 所以我要 在第一个射程之后 d={key1:偶数,key2:奇数,key3:偶数,key4:偶数} 在第二个按键范围之后 d={key1:偶数,key2:偶数,key3:奇数,key4:偶数} 可以用python实现吗?您可

我试图在运行时
O(n)
更改字典中的一系列值。 其中n是我需要更改的范围内的元素数

例如,如果我的字典中有键的编号,我会得到一系列键的列表 列表=[(键1,键3),(键2,键3)] 在这种情况下,如果我从
d={key1:奇数,key2:偶数,key3:奇数,key4:偶数}
所以我要 在第一个射程之后
d={key1:偶数,key2:奇数,key3:偶数,key4:偶数}
在第二个按键范围之后
d={key1:偶数,key2:偶数,key3:奇数,key4:偶数}


可以用python实现吗?

您可以这样做。这是O(n),其中n是需要更改的密钥数


如果您有一个范围无元组列表,例如:

key_ranges = [(2,6), (4,8)]
key_ranges = [ range(a[0],a[1]) for a in key_ranges ]
我相信你可以用:

change_keys = set.union(*map(set,key_ranges))
但是,当然,生成集合需要操作。但在某个时刻,你要么复制钥匙,要么找到重复的钥匙。不确定它是否可以避免

或者,如果您想复制,请不要调用
set

key_ranges = [(2,6), (4,8)]
change_keys = []
for a in key_ranges:
    change_keys.extend(range(a[0],a[1])

如果n的真正含义是范围列表的长度,那么使用字典无法实现这一点。例如,如果范围为[(0100000000000)],则在字典中执行此操作将花费与范围列表中的位数成指数的时间

如果选择了正确的数据表示和算法,则可以在nlogn中实现操作,其中n是范围列表的长度。就范围内的实际元素数量而言,这通常比O(n)的运行时快指数级

以下是一个可能的解决方案:

  • 定义由范围列表组成的数据结构。列表中某个范围内的元素已从其原始起始状态“翻转”

  • 定义一个例程,将一组新翻转(传入范围列表)与现有翻转“合并”,并查找不相交的翻转集

  • 例行程序应:

  • 将数据结构的范围与传入范围列表合并
  • 找到第一个元素最小的范围集,称之为A
  • 查找在A中最后一个范围结束之前开始的范围集,将其与A合并
  • 根据第一个元素对A中的范围进行排序
  • 将a中的每个范围(a,b)分为(a,b1)和(b1,b),对于a中的每个范围(b1,?)。a中的范围现在应不重叠
  • 删除(a,b)的所有对。(a,b)现在在a中应该是唯一的
  • 将所有范围(a,b)、(b,c)连接到a中的(a,c)中
  • 在数据结构中添加一个。转到步骤2,从尚未添加的下一个最小元素开始

  • 什么是
    n
    ?字典中的元素数是多少?射程的长度?需要更改的元素数?好的评论更新了我的帖子键的顺序是任意的,因此不清楚如何使用数字范围选择要更改的键。是否有另一个变量存储键的顺序?dict是无序的,因此无法对它们进行索引。我的键是0中的数字-infinity@Quantico当前位置你为什么认为这不会是O(n)?基本上每个键只执行一次操作,但这仍然不能改变每个键只执行一次操作的事实,并且(希望)在你的范围内没有重复任何键,它将是O(n)。即使使用嵌套的for循环,操作的总数也类似于
    sum(len(eachrange)表示元组列表中的每个chrange)
    @Quantico:当你似乎不知道那是什么时,人们很难给你想要的答案。即使存在重叠范围,您最近的评论似乎与您先前要求使用O(n)算法的要求完全矛盾。@ealfonso是正确的,如果您希望有大量重叠范围,您实际上可能会节省计算(?)通过计算
    change\u keys
    列表中的每个键,并丢弃偶数次出现的任何键。但是,您仍然没有保存键的数量@如果n是列表中的范围数,则askewchan计算change_keys中的每个键的时间将以指数形式增长。OP:您可能应该考虑数据结构的设计。如果您需要翻转范围(010000000),那么如果您使用dict,则相对于输入中的位数,这将需要指数长的时间。我仍在考虑您建议的解决方案。一旦我有了更好的理解,我要么让你知道,要么接受答案:)这是一个学校的项目。正如您在我最初的询问中所看到的,我没有要求解决方案,只是想知道python是否可以在O(n)中执行特定的操作。如果“n是需要更改的范围内的元素数”,那么答案是肯定的。但我怀疑这就是你的项目的意义,因为那是毫无意义的。
    key_ranges = [(2,6), (4,8)]
    change_keys = []
    for a in key_ranges:
        change_keys.extend(range(a[0],a[1])