C ++ HashMap或Map在时间复杂度和内存空间方面

时间:2016-01-05 11:00:57

标签: algorithm c++11 dictionary complexity-theory unordered-map

我要存储一个稀疏矩阵,其中元素只是'1'或'2'(代表BlueCar和RedCar)。 在读取带逗号分隔值的.csv后,我只知道矩阵的大小。 我必须实施算法来移动汽车

  • 蓝色向下移动;
  • 红色向右移动;
  • ;
  • 有一个,其中所有蓝色的都移动而转向移动所有红色的(只有当目的地为空时才能移动汽车)。

所以算法必须:

  • 循环数据结构(选择红色汽车或蓝色汽车移动)
  • 必须找到目的地位置是否空闲。自由意味着'位置 不存在',因为我只想保存现有的汽车 与他们的坐标相关联。
  • 必须更新移动车辆的坐标或删除旧位置并插入新位置。

我必须选择最佳的数据结构来节省汽车和坐标,这在时间复杂度和内存使用方面都很有效。

详细说明,在实现的后续步骤中,我必须处理openMP和MPI。

最好使用键值对(1)的单一结构或每种车型的一种结构(2),其中我只需要保存坐标?

(1)我想到std::map<std::pair<row,column>,value>std::unordered_map。 我不知道该选择什么,但我知道地图访问是O(logN),无序是O(1)。我认为无序地图中的元素可以很容易地排序,因为我在读取文件时以有序的方式插入它们。 当汽车移动时,我必须改变它作为map / unordered_map键的坐标。但现在问题是:更改密钥(如果可能)或删除并插入新的键值对更好?

(2)如果在这种情况下第二种情况对我来说比第一种情况更好,我可以实施哪种数据结构?

1 个答案:

答案 0 :(得分:2)

因为,蓝色车只向下移动,所以,你只需要map< column, set<row>>来存储蓝色车的位置。

同样,我们可以将红色汽车的位置存储为map< row, set<column>>

这将减少程序的内存使用量,并可能加快查找性能。

案例map<column, set<row>>的查找性能会更好,因为我们知道在map中使用的数据结构是二叉搜索树,因此,对于map<pair<row, column> , value>,树的大小远大于在前一种情况下。想象一下,您需要查找&lt; 2,3&gt;,因此,在后一种情况下,您可能需要遍历所有对&lt; 1,x&gt;直到你达到&lt; 2,x&gt;最后是目的地。

对于unordered_map,性能也更好,因为unordered_map正在使用散列,方法pair<row, column>需要将更多数量的项映射到相同的空间大小,与之比较只需映射row,所以碰撞次数要大得多。

此外,我们知道,最好逐列处理蓝色汽车,然后逐行处理,因为在这种情况下,我们可以轻松地检测到有蓝色汽车(1,1)跟随的情况通过(2,1),可能会导致碰撞,因此通过unordered_map存储蓝色汽车,然后按订单设置存储列可能会带来巨大的优势。因此,通过使用此方法,我们可以轻松地使用地图或unordered_map,轻松设置或unordered_set进行交换,具体取决于要求和效果。