查询整数Map以提取相关链接整数的最快方法

时间:2014-07-16 19:48:25

标签: c#

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

startNum = 126
endNum = 75

linked nums would be 105,90, since 126 brings me to 105, 105 brings me to 90 and 90 takes me to 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 - 

1 个答案:

答案 0 :(得分:2)

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

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

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

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

您可以逐行读取向图表添加节点和边线。每条边应具有相同的权重= 1.当您有最终图时,可以使用Dijkstra's algorithm查找任意两个数字(节点)之间的短路径。

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

如果您不想从头开始实现所有内容,可以使用许多图库之一。我个人喜欢QuickGraph在这个库中甚至有question如何使用Dijkstra。