密集和稀疏矩阵的高效(时间和空间复杂度)数据结构

2023-11-24

我必须读取一个文件,其中存储了一个包含汽车的矩阵(1=蓝色汽车,2=红色汽车,0=空车).

我需要编写一个算法来移动汽车矩阵的这种方式:

  • 蓝色的会动downward;
  • 红色的移动向右;
  • 有一个turn其中所有蓝色的都移动,然后轮流移动所有红色的。

在读取文件之前,我不知道矩阵大小以及它是密集还是稀疏,所以我必须实现两种数据结构(一种用于密集,一种用于稀疏)和两种算法。

我需要到达可能的最佳时间和空间复杂度.

由于未知矩阵大小,我认为将数据存储在堆上。

如果矩阵是dense,我想使用类似的东西:

short int** M = new short int*[m];
short int*  M_data = new short int[m*n];

for(int i=0; i< m; ++i) 
{
    M[i] = M_data + i * n;
}

通过这个结构,我可以分配连续的内存空间,并且访问起来也很简单M[i][j].

现在的问题是选择的结构sparse情况下,我还必须考虑如何以最简单的方式通过算法移动汽车:例如,当我评估一辆车时,我需要轻松找到在下一个位置(向下或向右)是否有另一辆车或如果它是空的。

最初我想定义继承自通用 Car 对象的 BlueCar 和 RedCar 对象。在这个对象中,我可以保存矩阵坐标,然后将它们放入:

std::vector<BluCar> sparseBlu;
std::vector<RedCar> sparseRed;

否则我可以做类似的事情:

vector< tuple< row, column, value >> sparseMatrix

但找到下一个位置是什么的问题仍然存在。

可能这不是最好的方法,那么如何才能有效地实现稀疏情况呢? (也使用独特的稀疏结构)


为什么不简单地创建一个内存映射直接在文件上? (假设您的数据 0,1,2 存储在文件中的连续字节(或位)中,并且这些字节的位置也代表汽车的坐标)

这样你就不需要分配额外的内存并读入所有数据,并且可以简单有效地访问数据M[i][j].

遍历这些行对 L1 缓存是友好的。

如果数据非常稀疏,您可以扫描一次数据,并在内存中保留一个空区域/块的列表(仅需要存储起始位置和大小),然后您可以在进一步的运行中跳过(并在需要时调整) 。

通过内存映射,只有经常访问的页面才会保留在内存中。这意味着一旦您扫描了空区域,内存将只分配给经常访问的非空区域(所有这些都将由内核自动完成 - 无需自己跟踪)。

另一个好处是您可以直接访问操作系统磁盘缓存。因此无需在内核空间和用户空间之间不断复制和移动数据。

为了进一步优化空间和内存使用,汽车可以以 2 位的形式存储在文件中。

Update:

我必须用 openMP 和 MPI 来移动汽车...内存映射会吗 也可以使用并发线程吗?

您当然可以使用多线程,但不确定 openMP 是否是这里的最佳解决方案,因为如果您同时处理数据的不同部分,您可能需要检查一些重叠区域(即一辆车可以从一个街区移动)到另一个)。

或者,您可以让线程在块的中间部分工作,然后启动其他线程来处理边界(红色汽车为一个字节,蓝色汽车为一整行)。

您还需要一个锁定机制来调整稀疏区域的列表。我认为最好的方法是启动单独的线程(当然取决于数据的大小)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

密集和稀疏矩阵的高效(时间和空间复杂度)数据结构 的相关文章

  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • 当 foreach 块的内容具有 Conditional 属性时,C# 编译器是否会对其进行优化?

    我正在工作中编写一些调试代码 我想知道我所做的是否会损害性能 让我们看一下代码 foreach var item in aCollection Debug WriteLine item Name 我知道 Debug 类使用 Conditio
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • c 使用 lseek 以相反顺序复制文件

    我已经知道如何从一开始就将一个文件复制到另一个文件 但是我如何修改程序以按相反的顺序复制它 源文件应具有读取访问权限 目标文件应具有读写执行权限 我必须使用文件控制库 例如 FILE A File B should be ABCDEF FE
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐