Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 空间复杂性:使用键初始化hashmap并单独更新其值,而不是在循环中动态填充键、值对_Python_Python 3.x_Hashmap_Time Complexity_Space Complexity - Fatal编程技术网

Python 空间复杂性:使用键初始化hashmap并单独更新其值,而不是在循环中动态填充键、值对

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':

假设我有一个简单的问题,涉及返回字符串中所有字符的出现索引。我知道您可以直接运行一个for循环并将其打印出来,但假设我必须以某种数据结构返回它

其他假设:我们知道这是一个ASCII字符串。字符串中不存在重复字符

我可以做两件事中的一件

    • 使用所有可能的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),但我不确定这两种方法的空间复杂度

    关于空间复杂性的争论:

    方法1,我的空间不“依赖”输入的大小。您可以假设,当您购买计算机以运行用于此特定目的的代码时,已经存在具有128个键的哈希映射。。我只是更新值,而不是根据输入创建新键和扩展hashmap。在这种情况下,它是O(1)

    方法2,hashmap最初是空的,没有任何内容,您必须通过遍历字符串用键、值对填充它。真的。。字典的填充量取决于输入大小。在这种情况下,它是O(N)


    我的论点正确吗?

    两种方法的复杂性都是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)?