簡體   English   中英

將具有相似距離的自然數分組

[英]Group natural numbers with similar distances

如果有我想分組的自然數列表。 我正在尋找 JavaScript 中的算法,但我對任何建議都很滿意。

示例系列只是示例,數據集的樣子。 生成的組不必與示例中的完全一樣,只是為了大致了解我試圖實現的目標。

我已經測試了分層聚類,但它不會導致所需的分組。

| 分隔組:

  • 3 4 5 | 10 12 13 14 | 100 200 300
  • 100 110 111 112 118 | 200 300 400 | 1000 1001 1004 | 1020 1030 1032 1040
  • 1 3 4 7 8 9 | 10 15 20 30 50 60 80 | 100 200 300
  • 1 2 3 | 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29 30 31 40 41 50 | 100 101 102 103 104 105 106 107 108 | 200 201 202 203 204 205 206 209 210 211 212 | 900 901 | 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 | 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 | 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125|3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223

編輯:第二組 3001 改為 300

當滿足以下兩個條件之一時,您將放置分隔符:

  1. 位數增加

  2. 相對於該組早期確定的數字,相鄰數字之間的差距顯着增加。

    3 4 5 | 10 12 13 14 | 100 200 300

在這里,您的第一個分隔符與第二個分隔符一樣具有較大的間隙和新數字。

100 110 111 112 118 | 200 300 400 | 1000 1001 1004 | 1020 1030 1032 1040

這里你的第一個分隔符的差距很大,第二個有一個很大的差距和一個新的數字,第三個有很大的差距。

1 3 4 7 8 9 | 10 15 20 30 50 60 80 | 100 200 3001

我的理論在這里失敗了; 我希望分隔符介於 200 和 3001 之間。也許還有關於組最小大小的第三條規則。 如果是這種情況,那么如果我們在末尾添加 3002 並且最小大小為 2,那么我們將在 200 和 3001 之間有一個差距。

1 2 3 | 10 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29 30 31 40 41 50 | 100 101 102 103 104 105 106 107 108 | 200 201 202 203 204 205 206 209 210 211 212 | 900 901 | 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 | 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 | 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125|3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223

這似乎符合模式。

import itertools

nums = [1, 6, 9, 100, 102, 105, 109, 134, 139]
for k, g in itertools.groupby(nums, key=lambda n: n//10):
    print(k, list(g))


#Result:
0 [1, 6, 9]
10 [100, 102, 105, 109]
13 [134, 139]

有關更多詳細信息,請參閱此。

Python 中的分組/聚類數字

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM