【问题标题】:Building up a matrix dynamically in the xy plane在 xy 平面上动态构建矩阵
【发布时间】:2014-01-12 11:53:40
【问题描述】:

我必须顺序读取一些数据(从文件中)并将数据放入矩阵中。我最初不知道矩阵的等级。例如,假设数据绘制在 x、y 平面上,Y 轴为年份,x 轴为增量。起初数据是 1990 年的,增量为 3

year increment(1991) increment(1992) increment(1993)
1990  12            25        35

请注意,我只会在读取数据线后知道增量。所以接下来是 1989 年,有 4 个增量。所以应该是

year increment(1990) increment(1991) increment(1992) increment(1993)
1989    23             33                    43          53
1990    0              12                    25          35

请注意,当新数据出现时,y 轴(1990)出现另一个增量年份。由于 1990 年没有增量年份 1990,因此必须用零填充或保持为空,但

最后我必须创建一个矩阵。例如

year increment(1990) increment(1991) increment(1992) increment(1993) 
1989    23             33                    43          53
1990    0              12                    25          35
1991    0              0                     23          33

要建立矩阵,困难的部分是我最初不知道年/增量,只有在阅读整个数据后才能知道。我想在读取数据的同时绘制矩阵,这样我就可以避免多次通过数据。

矩阵在xy轴的位置只有在整个数据处理完后才能知道!

有什么建议吗?

【问题讨论】:

    标签: c# algorithm c++11 matrix


    【解决方案1】:

    我非常喜欢稀疏矩阵解决方案,但您可以使用http://en.wikipedia.org/wiki/Dynamic_array 的版本。动态数组是在它们太满时调整大小的数组。调整大小很昂贵,但是如果每次调整大小时都将大小增加一个常数因子,那么调整大小的成本会计算出来,如果最终大小有 n 个元素,则总成本仍然是 O(n)。

    要为此使用动态数组,您可以为每一行创建两个动态数组,一个增长的年份比目前看到的要大,一个增长的年份比目前看到的要小(所以年份按降序排列)数组)。

    另一种方法是为矩阵创建一个存储区域,仅使用中心部分,因此始终有空间可以在任何方向添加条目。然后,您必须检查,当您即将越过边缘时,将这个存储的大小增加一个常数因子会导致最多 O(n) 的总成本。我怀疑它会,但常数因素可能不是很好。

    【讨论】:

      【解决方案2】:

      您可以使用SortedList<int, SortedList<int, int>> 将其构建为稀疏矩阵

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-04
        • 2011-03-08
        • 2012-06-23
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多