繁体   English   中英

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

[英]Fastest way to query a Map of Integers to extract related Linked Integers

我正在为嵌入式设备编写代码,我有一个数字映射,如下所示是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 - 

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

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

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

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

您可以逐行读取将节点和边添加到图形中。 每个边缘应具有相同的权重=1。当拥有最终图形时,可以使用Dijkstra的算法来查找任意两个数字(节点)之间的短路路径。

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

如果您不想从头开始实现所有功能,则可以使用许多图形库之一。 我个人喜欢QuickGraph ,甚至在这个库中还有一个如何使用Dijkstra的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM