C# 查询整数映射以提取相关链接整数的最快方法

C# 查询整数映射以提取相关链接整数的最快方法,c#,C#,我正在为一个嵌入式设备编写代码,我有一个数字地图,下面显示的是151到66之间的子集,相邻的数字是链接的数字,因此对于151,其链接的数字将是150-148-146-136-131-91-,依此类推,我有一个方法,它接受两个参数int-startNum和int-endNum,目标是返回一个包含2个整数的数组,该数组将我从startNum链接到endNum,因此示例见下文 startNum = 126 endNum = 75 链接NUM将是105,90,因为126将我带到105,105将我带到9

我正在为一个嵌入式设备编写代码,我有一个数字地图,下面显示的是151到66之间的子集,相邻的数字是链接的数字,因此对于
151
,其链接的数字将是
150-148-146-136-131-91-
,依此类推,我有一个方法,它接受两个参数
int-startNum
int-endNum
,目标是返回一个包含2个整数的数组,该数组将我从
startNum链接到endNum
,因此示例见下文

startNum = 126
endNum = 75
链接NUM将是105,90,因为126将我带到105,105将我带到90,90将我带到75
,还有其他几种路径可以做到这一点,我的问题是,是否可以在不使用嵌套for循环和测试每种可能的组合的情况下计算出这些链接的数字

151 = 150 - 148 - 146 - 136 - 131 - 91 - 
150 = 149 - 147 - 145 - 135 - 130 - 90 - 
149 = 148 - 146 - 144 - 134 - 129 - 89 - 
148 = 147 - 145 - 143 - 133 - 128 - 88 - 
147 = 146 - 144 - 142 - 132 - 127 - 87 - 
146 = 143 - 139 - 137 - 127 - 125 - 89 - 
145 = 144 - 142 - 140 - 130 - 125 - 85 - 
144 = 143 - 141 - 139 - 129 - 124 - 84 - 
143 = 142 - 140 - 138 - 128 - 123 - 83 - 
142 = 141 - 139 - 137 - 127 - 122 - 82 - 
141 = 140 - 138 - 136 - 126 - 121 - 81 - 
140 = 139 - 137 - 135 - 125 - 120 - 80 - 
139 = 136 - 132 - 130 - 120 - 118 - 82 - 
138 = 137 - 135 - 133 - 123 - 118 - 78 - 
137 = 136 - 134 - 132 - 122 - 117 - 77 - 
136 = 135 - 133 - 131 - 121 - 116 - 76 - 
135 = 134 - 133 - 132 - 131 - 130 - 129 -
134 = 133 - 131 - 129 - 119 - 114 - 74 - 
133 = 132 - 130 - 128 - 118 - 113 - 73 - 
132 = 131 - 130 - 129 - 128 - 127 - 126 -
131 = 130 - 128 - 126 - 116 - 111 - 71 - 
130 = 129 - 127 - 125 - 115 - 110 - 70 - 
129 = 126 - 122 - 120 - 110 - 108 - 72 - 
128 = 127 - 125 - 124 - 116 - 110 - 74 - 
127 = 126 - 124 - 122 - 112 - 107 - 67 - 
126 = 123 - 119 - 117 - 107 - 105 - 69 - 
125 = 124 - 123 - 122 - 121 - 120 - 119 -
124 = 123 - 121 - 119 - 109 - 104 - 64 - 
123 = 120 - 116 - 114 - 104 - 102 - 66 - 
122 = 121 - 119 - 118 - 110 - 104 - 68 - 
121 = 120 - 118 - 116 - 106 - 101 - 61 - 
120 = 119 - 117 - 115 - 105 - 100 - 60 - 
119 = 116 - 112 - 110 - 100 - 98 - 62 - 
118 = 117 - 115 - 113 - 103 - 98 - 58 - 
117 = 116 - 114 - 112 - 102 - 97 - 57 - 
116 = 115 - 113 - 111 - 101 - 96 - 56 - 
115 = 112 - 108 - 106 - 96 - 94 - 58 - 
114 = 113 - 111 - 109 - 99 - 94 - 54 - 
113 = 112 - 110 - 108 - 98 - 93 - 53 - 
112 = 111 - 109 - 107 - 97 - 92 - 52 - 
111 = 108 - 104 - 102 - 92 - 90 - 54 - 
110 = 109 - 107 - 105 - 95 - 90 - 50 - 
109 = 108 - 106 - 104 - 94 - 89 - 49 - 
108 = 105 - 101 - 99 - 89 - 87 - 51 - 
107 = 106 - 104 - 102 - 92 - 87 - 47 - 
106 = 105 - 103 - 101 - 91 - 86 - 46 - 
105 = 104 - 102 - 100 - 90 - 85 - 45 - 
104 = 103 - 101 - 99 - 89 - 84 - 44 - 
103 = 102 - 100 - 98 - 88 - 83 - 43 - 
102 = 101 - 99 - 97 - 87 - 82 - 42 - 
101 = 100 - 98 - 96 - 86 - 81 - 41 - 
100 = 99 - 97 - 95 - 85 - 80 - 40 - 
99 = 96 - 92 - 90 - 80 - 78 - 42 - 
98 = 97 - 95 - 93 - 83 - 78 - 38 - 
97 = 94 - 90 - 88 - 78 - 76 - 40 - 
96 = 95 - 93 - 91 - 81 - 76 - 36 - 
95 = 94 - 93 - 92 - 91 - 90 - 89 -
94 = 93 - 92 - 91 - 90 - 89 - 88 -
93 = 92 - 91 - 90 - 89 - 88 - 87 -
92 = 91 - 89 - 87 - 77 - 72 - 32 - 
91 = 90 - 89 - 88 - 87 - 86 - 85 -
90 = 89 - 87 - 85 - 75 - 70 - 30 - 
89 = 86 - 82 - 80 - 70 - 68 - 32 - 
88 = 87 - 85 - 83 - 73 - 68 - 28 - 
87 = 85 - 84 - 81 - 78 - 70 - 36 - 
86 = 85 - 83 - 82 - 74 - 68 - 32 - 
85 = 82 - 78 - 76 - 66 - 64 - 28 - 
84 = 83 - 81 - 79 - 69 - 64 - 24 - 
83 = 81 - 80 - 77 - 74 - 66 - 32 - 
82 = 81 - 80 - 79 - 78 - 77 - 76 -
81 = 78 - 74 - 72 - 62 - 60 - 24 - 
80 = 79 - 77 - 75 - 65 - 60 - 20 - 
79 = 76 - 72 - 70 - 60 - 58 - 22 - 
78 = 77 - 75 - 74 - 66 - 60 - 24 - 
77 = 74 - 70 - 68 - 58 - 56 - 20 - 
76 = 75 - 73 - 71 - 61 - 56 - 16 - 
75 = 73 - 72 - 69 - 66 - 58 - 24 - 
74 = 65 - 63 - 60 - 47 - 41 - 32 - 
73 = 70 - 66 - 64 - 54 - 52 - 16 - 
72 = 65 - 64 - 56 - 51 - 48 - 24 - 
71 = 67 - 65 - 59 - 58 - 53 - 32 - 
70 = 69 - 67 - 66 - 58 - 52 - 16 - 
69 = 67 - 63 - 59 - 54 - 39 - 24 - 
68 = 63 - 59 - 56 - 53 - 41 - 32 - 
67 = 65 - 64 - 61 - 58 - 50 - 16 - 
66 = 60 - 56 - 51 - 48 - 36 - 21 - 

我会将这些链接数字列表建模为一个图形,即数字作为节点/顶点,节点之间的链接作为边。示例中的第一行如下所示:

151=136-148-146-150-91-131-

因此,节点151将与节点136、节点136与节点148、节点148与节点146等连接

编辑 在@cahinton发表评论后,我不确定上述对这些列表的解释是否正确。另一个是节点151将与节点连接:136、148、146、150

通过向图形中添加节点和边,可以逐行读取。每条边应具有相同的权重=1。当您有一个最终图形时,您可以使用它来查找任意两个数字(节点)之间的短路路径

Dijkstra算法的基本实现的复杂性是O(N^2),其中N-节点数。如果您需要,也有更高效的实现。在您的情况下,基本解决方案应该足够了,因为您只有151-66=85个节点


如果不想从头开始实现所有功能,可以使用许多图形库中的一个。就我个人而言,我喜欢这个库中甚至有一个如何使用Dijkstra的方法。

这些数字在数学上与它们的键相关吗?有点相关,它们是减法的结果,所以151=136,用来得到136的数字应该是15,但15似乎与其他任何序列都没有关系,或者151序列中的任何其他数字。正如我所说的,键及其值是减法的结果。我已更新地图,以显示链接的数字。因此,这将允许我快速找到两个数字,其中startNum和endNum之间存在链接?是的。您的图形非常小,Dijkstra的算法将在几乎为零的时间内计算最短路径。@MichałKomorowski您确定链接吗?按照我的理解,节点156将链接到节点136、148、146、150、91和131。Dijkstra的算法仍然有效,但图形的构建方式会有所不同。@cahinton当我写下我的答案时,我确信这一点,但现在我不确定;)你可能是对的,这是作者的一个问题。正如你现在看到的,如果这有帮助的话,链接的数字有一个模式