Python 空间复杂性:使用键初始化hashmap并单独更新其值,而不是在循环中动态填充键、值对
假设我有一个简单的问题,涉及返回字符串中所有字符的出现索引。我知道您可以直接运行一个for循环并将其打印出来,但假设我必须以某种数据结构返回它 其他假设:我们知道这是一个ASCII字符串。字符串中不存在重复字符 我可以做两件事中的一件Python 空间复杂性:使用键初始化hashmap并单独更新其值,而不是在循环中动态填充键、值对,python,python-3.x,hashmap,time-complexity,space-complexity,Python,Python 3.x,Hashmap,Time Complexity,Space Complexity,假设我有一个简单的问题,涉及返回字符串中所有字符的出现索引。我知道您可以直接运行一个for循环并将其打印出来,但假设我必须以某种数据结构返回它 其他假设:我们知道这是一个ASCII字符串。字符串中不存在重复字符 我可以做两件事中的一件 使用所有可能的128个键和 None作为值 遍历字符串,只需更新字典/哈希映射 使用索引作为键的值 遍历dictionary元素,并删除那些键、值 值为None的配对 ascii_occurrence = {'a': None, 'b': None, 'c':
- 使用所有可能的128个键和
作为值None
- 遍历字符串,只需更新字典/哈希映射
使用索引作为键的值 - 遍历dictionary元素,并删除那些键、值
值为
的配对None
ascii_occurrence = {'a': None, 'b': None, 'c': None ... char#128: None} #Initialize a hashmap with each of the 128 characters as key, and set None to its value. for charIndex in string: ascii_occurrence[string[charIndex]] = charIndex indexMap = {k: v for k, v in ascii_occurrence.items() if v is not None} print(indexMap)
- 初始化没有键或值的空哈希映射
- 遍历字符串并创建键、值对
ascii_occurrence = {} for charIndex in string: ascii_occurrence[string[charIndex]] = charIndex print(ascii_occurrence)
我的论点正确吗?两种方法的复杂性都是O(N^2),这是因为每次迭代都有一个索引(
string[charIndex]
)。然而,在这种情况下,第二种方法通常是更好的方法。但是,您也可以使用字典理解以更优化的方式(在运行时方面)进行操作,如下所示:
ascii_occurrence = {charIndex: ind for ind, charIndex in enumerate(string)}
在这种情况下,除了不使用索引获取字符外,您不需要将项目分配给以前创建的字典。相反,Python将根据需要为您创建字典,这将节省您在每次迭代时调用\uuuu setitem\uuu
函数的时间,而每次迭代本身就是暂停和恢复函数帧的组合
这段代码在运行时和内存方面的复杂性当然是O(N)
现在,如果你正在寻找一种更优化的方法,这是很容易做到的,但你必须牺牲一点其他的东西。这就是说,如果您想要更少的运行时间,您应该放弃一些内存,反之亦然。但是如果你不想这样做,你可能会想在你达到这一点之前先创建你的字典。您可以在创建主字符串时创建词典。这里还有其他一些棘手的方法,比如通过将枚举对象传递给dict
对象,直接从枚举对象创建dict
。但在这种情况下,索引将是键,字符将成为值
ascii_occurrence = dict(enumerate(string))
谢谢你的回答!你能更详细地解释一下为什么它是O(N^2)吗?据我所知,您只需在字符串中迭代一次,在循环中,您正在为一个键设置值,是不是或者在字典中获取一个项O(1)?