【问题标题】:How come 2d array indexing doesn't conflict为什么二维数组索引不冲突
【发布时间】:2020-02-26 17:34:52
【问题描述】:

所以我在研究二维数组,发现既然它们是连续存储的,就像一维数组为什么索引不冲突那里?

这是我的二维阵列的图示

在这里我试图模仿它在内存中的表示方式。

现在假设 arr[0][0] 位于 x0001 内存位置,那么当我尝试访问显然是越界索引的 arr[0][3] 时,如何它向我显示了错误。 我正在使用以下公式进行索引 - (n*m+c)+B 用于索引位置

  • n = 当前行
  • m = 总列数
  • c = 当前列
  • B = 数据类型的大小(为简单起见,假设 B = 1)

现在对于 arr[0][3]arr[1][0] 公式 (n*m+c)+B 的输出是相同的(3),如果我们将该值添加到初始指针(x0001),那么我们将获得相同的内存地址(x0001+3=x0004) 然后语句 arr[1][0] 为何返回 13(x0004 处的值) 但 arr[0][3] 返回索引超出范围错误。


假设

由于我不清楚二维数组中的内存是如何工作的,所以我假设了以下几点

  1. 公式(n*m+c)+B 用于实际使用,而不仅仅是理论上理解二维数组的工作原理。
  2. 地址是连续的,从初始单元格开始计数,即 & of arr[0][0] => (x0001)

【问题讨论】:

    标签: arrays memory multidimensional-array data-structures


    【解决方案1】:

    不清楚您所说的“冲突”是什么意思。确实,如果允许索引超出范围,则对于不同的索引,该公式会产生相同的结果;如果索引值仅限于合法值,则不存在冲突。

    不同的语言处理这种情况的方式不同(忽略那些不将二维数组表示为内存的连续部分的语言)。一种方法是忽略这个问题,遵循“垃圾进,垃圾出”的理念。另一种方法是在尝试定位相关单元之前明确检查索引。

    【讨论】:

      【解决方案2】:

      鉴于所描述的行为,公式似乎是:

      assert c >= 0 && c < m or out_of_bounds
      assert n >= 0 && n < t or out_of_bounds
      return s+n*b*m+c*b
      

      假设

      s = start
      n = current row
      m = total columns
      t = total rows
      c = current column
      b = size of datatype
      

      【讨论】:

      • 因此,即使发生的不仅仅是直接索引来检索特定位置的值,它仍然算作 O(1)???????
      • O(1) + O(1) + O(1) = O(1)
      • @Mahi 它是 O(1),因为无论大小如何,运行时间和空间都保持不变。该操作已经进行了乘法和加法以及检索值,但这些操作并未用于大 O 表示法。
      猜你喜欢
      • 2016-09-02
      • 1970-01-01
      • 2022-01-05
      • 2023-03-07
      • 1970-01-01
      • 2019-12-11
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多