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)的运行时快指数级 以下是一个可能的解决方案:
什么是
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])