我在C中有一个大小为m x n的矩阵,大小未知。我必须对矩阵进行操作,比如:删除第一个元素,找到第I个元素。(大小不会太大,从10到50列的矩阵)。链表和哈希表哪个更有效?如何将矩阵的一列映射到链表或哈希表的一个元素,这取决于我选择使用什么?
谢谢
链表不能提供很好的随机访问,因此从这个角度来看,您可能不希望使用它们来表示矩阵,因为查找时间会影响您试图查找的每个元素。
哈希表非常适合查找元素,因为它们可以为任何给定的键提供接近恒定时间的查找,假设哈希函数是体面的(使用成熟的哈希表实现是明智的)
提供了您所给出的约束条件,链表的哈希表可能是一个合适的解决方案,尽管它仍然会给您带来查找第i个元素的问题,因为您仍然需要遍历每个链表以查找所需的元素。这将为行提供O(1)次查找,但为列提供O(n)次查找,其中n是列计数。
此外,这很困难,因为您必须确保hashtable中的每个列表随着列数的增加/减少而使用适当数量的节点进行更新,因此您不会在空间复杂性方面为自己购买太多。
2D数组可能最适合表示矩阵,在这种情况下,您可以通过有效地管理内存分配和复制来提供一些允许矩阵增长的能力。
另一种方法是查看类似std::vector的东西来代替链表,链表的作用类似于数组,因为它在内存中是连续的,但允许您动态增长大小的灵活性。
如果它的工作,那么使用哈希表,平均运行时间将是0(1)。对于删除/获取/设置给定索引,在O(1) 2d arr将是最优的。