簡體   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