存储在单个向量中的三角形邻接矩阵的正向和逆向索引

2023-12-31

我有一张带有点的地图,我想知道每个点之间的距离。 (这可能称为无向循环图)。由于点很多,我的存储空间有限,所以阵列需要很密集。对于 4 个城市(n = 4),我需要 6 个索引来映射这 4 个城市:

Index #, City1 <> City2 
=========================
Index #0, 1 <> 2
Index #1, 1 <> 3
Index #2, 1 <> 4
Index #3, 2 <> 3 
Index #4, 2 <> 4
Index #5, 3 <> 4

Index total = 6
Cities = 4

或者用三角形来看:

(1-2)(1-3)(1-4)
(2-3)(2-4)
(3-4)

这(方向/边缘——所有道路都是双向的)。如果我有 260 个城市,我需要 33670 个索引,而不是 260x260 或 67600 个索引。例如:对于 4 个城市,索引 #4 是从 2 到 4 的距离(或“翻转”为 4 到 2)。
注意:上面是一个示例,其中 1 到每个其他城市,然后 2 到每个城市,除了 1, ... ,倒数第二个城市到最后一个城市(n-1 到 n)。其他“形状”可供讨论(例如相反的顺序或什至其他方案)。

如果我有 260 个城市,我如何知道从零开始的索引 #i 指的是哪些城市?我可以使用 2 个公式从索引中获取 city1 和 city2 并再次返回吗? (例如:索引#33333 是 234 到/从 249)。

getIndex(city1, city2) // returns index
getCities(Index)       // returns city1, city2

用一些高中代数推导这些并不难。但计算它们是相当昂贵的。

Let (i,j)位于城市的边缘i >= 1到城市j > i然后让p >= 0是表示线性化三角矩阵的向量中的相应索引。然后

p = j * (j - 3) / 2 + i

根据这个公式,线性布局为:

(i,j) = (1,2)(1,3)(2,3)(1,4)(2,4)(3,4)...
  p   =   0    1    2    3    4    5 ...

例如。为了(1,2)我们有2 * (2 - 3) / 2 + 1 == 0正如你所期望的。而对于(2,4) it's 4 * (4 - 3) / 2 + 2 == 4.

要想走另一条路,

j = floor((3 + sqrt(8 * p + 1)) / 2)
i = p - j * (j - 3) / 2

For p == 0, j = floor((3 + sqrt(1)) / 2) == 2. Then i = 0 - 2 * (2 - 3) / 2 == 1. For p == 4, it's j = floor((3 + sqrt(33)) / 2) = 4, then i = 4 - 4 * (4 - 3) / 2 = 2.

平方根可能就是您不经常看到使用此技术的原因。请注意,整数平方根可以正常工作,在某些情况下可能比浮点数更快。

总而言之,使用指向长度不断增加的行的指针数组可能更快、更简单,并且几乎具有同样的存储效率。

Addition

事实证明毕竟有is消除平方根的一种方法。我们将三角形阵列切成两半,并将这些碎片拼成一个矩形。对于一个图表n = 5顶点:

j                             p = 0   1   2   3   4
=  ---                           -------------------
2 | a |                         | a $ j | i | h | g |                           
   -------                       ----===------------
3 | b | c |        is arranged: | b | c $ f | e | d |
   -----------                   -------------------
4 | d | e | f |                   5   6   7   8   9
   ---------------
5 | g | h | i | j |
   ---------------
i = 1   2   3   4

其中右侧是写成两行的向量。

现在对于奇数 n,

    { n*j + i - k,                     if j < n/2 + 2
    {    where k = 2*n+1
p = {
    { kk - (n*j + i)                   otherwise
    {    where kk = (floor(n/2)+4)*n

常数k and kk可以在创建数组时计算一次。

要走另一条路,让j' = floor(p/n) and i' = p mod n. Then

i = i' + 1,  j = j' + 2                 if j' <= i'
i = n - i',  j = n - j'                 othewise

我会让你算出偶数n case.

由于每种情况下都有 2 路分支,因此它们只比普通的 2d 数组索引贵一点。

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

存储在单个向量中的三角形邻接矩阵的正向和逆向索引 的相关文章

  • 如何递归地将嵌套对象数组转换为平面对象数组?

    我有以下深度嵌套对象数组 const data name foo children count 1 name A count 2 name B name bar children count 3 name C children count
  • 如何从二维数组中仅打印单个列?

    我正在编写这个程序 我必须只打印二维数组的一列 而不是两者 for int i 0 i lt sjf length i for int j 0 j lt sjf i length j System out printf 5d 4s sjf
  • 使用 pybind11 修改 std::array 的默认值

    我的目标是修改在中声明的数组C struct并赋予默认值 我读过了this https pybind11 readthedocs io en stable advanced cast stl html making opaque types
  • 从两个数组中查找公共文件

    我正在尝试从两个数组中查找通用名称文件 我已将两个不同文件夹的文件名保存在两个不同的数组中 现在我正在创建一个通用文件数组 其中包含具有通用名称的文件 filenames 1 包含文件夹 1 中文件名称的数组 filename2 包含文件夹
  • 按共同日期对数组数据进行排序

    我有一个包含许多行和 3 列的 csv 文件 日期 代表和销售额 我想使用 Python 生成一个新数组 该数组按日期对数据进行分组 并且对于给定日期 按销售额对代表进行排序 例如 我的输入数据如下所示 salesData 201703 B
  • 与 Array 相比,使用 Ruby NArray 有哪些优点?

    我刚刚遇到了 Ruby 的 NArray 库 请原谅我在问这个问题时的无知 与标准 Ruby Array 实现相比 使用 NArray 库有哪些优点 我已经看到 NArray 是面向数值计算的 但是看看 API 看起来好像只有一些针对数值的
  • 使用 Haskell 绘制图表

    是否可以使用 Haskell 绘制一个简单的图表 你们中的任何人都可以告诉我该怎么做吗 该图应至少包含 3 个点 Haskell 图表 https github com timbod7 haskell chart似乎不错 The wiki
  • 加权图的 BFS 算法 - 寻找最短距离

    我看过很多帖子 即 post1 https stackoverflow com questions 30409493 using bfs for weighted graphs post2 https cs stackexchange co
  • 将字符串转换为字节数组时会发生什么

    我认为这是一个新手类型的问题 但我已经很理解了 我可以找到很多关于如何用各种语言将字符串转换为字节数组的帖子 我不明白的是逐个字符地发生了什么 据我所知 屏幕上显示的每个字符都由一个数字表示 例如它的 ascii 代码 我们现在可以坚持使用
  • 如何找到数组中存在的项目的长度/数量? [复制]

    这个问题在这里已经有答案了 可能的重复 函数参数中数组的长度 https stackoverflow com questions 8269048 length of array in function argument 我的数组大小是 5
  • 删除数组中的重复元素[重复]

    这个问题在这里已经有答案了 可能的重复 在 JavaScript 数组中查找重复值的最简单方法 https stackoverflow com questions 840781 easiest way to find duplicate v
  • 在 JavaScript 中对并行数组进行排序

    我有几个名为名称和销售的并行数组 我让用户输入最多 100 名销售人员 显然是名字 及其销售额 我将这些打印到表格上没有问题 问题 无论如何对我来说 是它们需要根据销售额按降序排序 我做了一个函数叫做sort其编码 很差 因为我刚刚开始学习
  • Outlook 中用于删除重复电子邮件的宏 -

    Public Sub RemDups Dim t As Items i As Integer arr As Collection f As Folder parent As Folder target As Folder miLast As
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 2D 矩阵上的 Numpy where()

    我有一个像这样的矩阵 t np array 1 2 3 foo 2 3 4 bar 5 6 7 hello 8 9 1 bar 我想获取行包含字符串 bar 的索引 在一维数组中 rows np where t bar 应该给我索引 0 3
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节
  • 将结构体数组传递给函数 C++

    抱歉这个菜鸟问题我只是有点困惑 如果我在 main 中有一个结构数组 我想将其传递给函数 struct MyStruct int a int b char c mayarray 5 MyStruct StructArray 10 myFun
  • 验证项目是否在开始日期和结束日期内

    我有一个java程序 它将检查每个项目的开始日期和结束日期 每个项目必须有自己特定的开始日期和结束日期范围 如果新的开始日期和结束日期的范围落在旧的开始日期和结束日期内 系统将提示错误消息 例如 Company ABC Item Numbe
  • 查找整数数组中的最大/最小出现次数

    我刚刚编写完一个算法 该算法可以在输入整数数组中查找出现次数最多 最少的值 我的想法是对数组进行排序 所有出现的地方现在都按顺序排列 并使用
  • 静态数组VS。 C++11 中的动态数组

    我知道这是一个非常古老的争论 全世界已经讨论过很多次了 但我目前很难决定在特定情况下应该使用静态数组和动态数组之间的哪种方法而不是另一种方法 实际上 我不会使用 C 11 我会使用静态数组 但我现在很困惑 因为两者可能有相同的好处 第一个解

随机推荐

  • 获取正在运行的进程的维度

    我正在尝试抓取应用程序中特定 x y 位置的屏幕截图 有没有办法在 Process 对象中获取正在运行的应用程序 然后获取它的尺寸 就像是 Process processlist Process GetProcesses foreach P
  • 验证错误:值无效

    我的 p selectOneMenu 有问题 无论我做什么 我都无法让 JSF 调用 JPA 实体上的 setter JSF 验证失败并显示以下消息 形式 位置 验证错误 值无效 我在同一类型的其他几个类 即连接表类 上进行了此工作 但我一
  • 无法使用 Espresso 将文本添加到 webview 文本字段

    我正在尝试将文本添加到 Esprsso 中的文本字段 在 Web 视图内 但收到此错误 引起原因 java lang RuntimeException 评估错误评估 状态 13 值 message 无法设置选择结束 hasMessage 真
  • Java 中的动态绑定==后期绑定吗?

    在不同的来源中 我读到了有关该主题的不同内容 例如维基百科说 后期绑定经常与动态调度混淆 但两者之间存在显着差异 但几行之后 在 Java 编程中 流行使用术语 后期绑定 作为动态分派的同义词 具体来说 这是指与虚拟方法一起使用的 Java
  • 部分选择排序与合并排序查找“数组中最大的 k”

    我想知道我的思路是否正确 我正在准备面试 作为一名大学生 我遇到的问题之一是找到数组中最大的 K 个数字 我的第一个想法是只使用部分选择排序 例如 从第一个元素扫描数组 并为看到的最低元素及其索引保留两个变量 并与数组末尾的该索引交换 并继
  • 如何批量加载从其他来源生成的自定义 Avro 数据?

    Cloud Spanner 文档说 Spanner 可以导出 导入 Avro 格式 此路径是否也可用于批量摄取从其他来源生成的 Avro 数据 该文档似乎表明它只能导入同样由 Spanner 生成的 Avro 数据 我运行了一个快速导出作业
  • 当 MPMovieControlStyle = MPMovieControlStyleNone 时如何触摸/单击 MPMoviePlayerController 视图

    在我的一个应用程序中 我不想显示任何视频控制器 但我需要接触媒体播放器视图 我需要在触摸电影播放器 时执行一些其他操作 我怎样才能实现它 请帮忙 提前致谢 您可以随时附上UITapGestureRecognizer查看并处理水龙头 UITa
  • 如何在 PySpark 中读取 Avro 文件

    我正在使用 python 编写 Spark 作业 但是 我需要读取一大堆 avro 文件 This https github com apache spark blob master examples src main python avr
  • Firebase 托管 MIME 类型

    有没有人找到一种方法来设置使用 Firebase 托管托管文件时在 Content Type 标头中返回的 mime 类型 文档说他们支持规则文件中的某些标头 但不支持内容类型 无论如何我都将其绑定 但由于错误 hosting header
  • 将范围传递给 AngularJS 上的服务

    我对 AngularJS 还很陌生 我想将范围传递给服务 这样我就可以根据scope value 执行标签搜索 div div div div
  • 扩展和集群 JPA

    我正在 jboss7 上构建一个常规 Java EE 应用程序 该应用程序将在数据层中使用 JPA 我想让这个应用程序随着负载的增加而扩展 虽然如何扩展 Web 层非常清楚 创建更多机器并将它们放在负载均衡器后面 但扩展数据层却不太清楚 我
  • 识别一般保护故障 (x86) 上的故障地址

    我正在尝试为 x86 上的一般保护错误 GP 13 编写 ISR 我无法从 INTEL 文档中找出如何找出导致异常的错误地址 我知道对于页面错误异常 GP 14 cr2 寄存器保存错误地址 任何帮助表示赞赏 我在这里所做的所有参考资料均来自
  • 客户端和服务器需要使用相同的端口进行连接吗?

    我有一个使用java的服务器客户端程序 我尝试创建一个ServerSocket有端口和客户端Socket具有不同的端口 并且它们无法相互连接 客户端抛出ConnectException 当我将 Client 上的套接字更改为与 Server
  • PHP 中的重定向/返回检查

    我有一个用 PHP 运行的网站 并且有一个页面 例如 confirm php 我只想允许登陆的用户确认 php 来自我指定的页面 例如 register php 我可以知道是否可以实现这一点 问候 安迪 你不能依赖HTTP 引用因为用户可以
  • 如何检测 Xamarin 表单 TabbedPage 中是否触摸了选项卡

    如何检测 Xamarin 表单 TabbedPage 中是否触摸了选项卡 这与我想出如何检测的页面更改检测不同 原因如下 我正在尝试解决一个相当丑陋的选项卡式页面溢出用户界面 标签栏右侧显示的丑陋的滚动条 每当有 gt 5 个选项卡时 因此
  • Apps 脚本 - 将 JSON 正确导出到 Google Sheet

    我对 Apps Script Javascript 还很初学者 我有一些使用 API 导出的 JSON 数据 以下是我这样做时得到的结果 console log jsonData 我试图 将此 JSON 数据转换为 CSV 将数据放入活动电
  • 杀死 Mac OSX 端口 80 上未知的自重启服务器

    我有一台服务器在端口 80 上运行 但我不知道它是什么或它来自哪里 当我跑步时 sudo lsof i 80 grep LISTEN I get httpd 80 root 5u IPv6 0x91f5a9de62859cfd 0t0 TC
  • 在 WHERE 子句中使用 CASE

    我的查询的简化版本 SELECT FROM logs WHERE pw correct AND CASE WHEN id lt 800 THEN success 1 ELSE END AND YEAR timestamp 2011 这是行不
  • NSDateFormatter 用于 BST 而不是 GMT+1

    我想在时间轴上显示以下字符串 格林威治标准时间 英国夏令时 这是代码 NSDateFormatter dateformatter NSDateFormatter alloc init dateformatter setDateFormat
  • 存储在单个向量中的三角形邻接矩阵的正向和逆向索引

    我有一张带有点的地图 我想知道每个点之间的距离 这可能称为无向循环图 由于点很多 我的存储空间有限 所以阵列需要很密集 对于 4 个城市 n 4 我需要 6 个索引来映射这 4 个城市 Index City1 lt gt City2 Ind