第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自定義排列,對均等分布

自定義排列,對均等分布

慕田峪9158850 2021-06-10 18:32:10
幾個星期以來,我一直在處理一個奇怪的問題,似乎無法得到我想要的結(jié)果。我想對對象列表進行排列以獲得唯一的對。然后以特定方式對它們進行排序,以最大化列表中任何點的對象的平均分布。這也意味著如果一個對象在一對的開頭,那么它也應(yīng)該在不久之后在一對的結(jié)尾。沒有配對可以重復(fù)。為了澄清,這里有一個例子。list (A,B,C,D) 可能會導(dǎo)致以下結(jié)果:(A,B)(C,D)(B,A)(D,C)(A,C)(B,D)(C,A)(D,B)(A,D)(B,C)(D,A)(C,B)請注意,每個字母每 2 對使用一次,并且字母頻繁切換位置。為了獲得排列,我使用了 python 腳本:perm = list(itertools.permutations(list,2))這給了我 12 對字母。然后我手動對這些對進行排序,以便盡可能多地選擇每個字母并盡可能多地切換位置。在列表中的任何一點,這些字母都將非常平均地分配。當(dāng)我完成解決這個問題的過程時,我知道我將在列表中的哪個位置停下來,但我不知道這對放置對的順序有多大影響。使用 4 個字母可以更容易地完成,因為 (4 個字母 / 2 對) = 2。我也希望這也適用于奇數(shù)排列對。例如:A,BC甲、乙、丙、丁、乙等等..我已經(jīng)嘗試了多種方法并嘗試識別模式,雖然有很多方法,但只有很多方法可以解決這個問題。也可能沒有完美的答案。我還嘗試對字母 P(4,4) 或 5 個字母 P(5,5) 進行正常排列,并且我嘗試選擇某些排列,將它們組合起來,然后將它們分成對. 這似乎是另一條路線,但除非我手動完成,否則我似乎無法弄清楚要選擇哪些對。任何幫助表示贊賞!也許試著指出我正確的方向:)我最終會嘗試將其實現(xiàn)到 python 中,但我不一定需要幫助編寫代碼。這更多是一個過程可能是什么的問題。
查看完整描述

1 回答

?
慕森王

TA貢獻1777條經(jīng)驗 獲得超3個贊

您所說的“最大化平均分配”是什么意思沒有明確定義。人們可能會考慮給定值的兩個幻影之間的最大對數(shù)。我將留給你展示我在這里給出的方法相對于它是如何執(zhí)行的。

對于 n 個對象,我們有 n*(n-1) 對。在這些(a, b)對中:

  • n 具有諸如 b = (a+1) modulo n 之類的索引

  • n 具有諸如 b = (a+2) modulo n 之類的索引

    等等。

我們可以生成前 n 對相差 1,然后生成 n 對相差 2...

對于每個差異,我們通過將差異添加到索引(模 n)來生成索引。當(dāng)我們得到a已經(jīng)用于這種差異的an 時,我們加 1(再次取模 n)。這樣,我們可以生成具有這種差異的 n 對。當(dāng)我們“滾動”索引時,我們確信每個值都會定期出現(xiàn)。

def pairs(n):

    for diff in range(1, n):

        starts_seen = set()

        index = 0

        for i in range(n):

            pair = [index]

            starts_seen.add(index)

            index = (index+diff) % n

            pair.append(index)

            yield pair

            index = (index+diff) % n

            if index in starts_seen:

                index = (index+1) % n

                

pairs2 = list(pair for pair in pairs(2))

print(pairs2)

# [[0, 1], [1, 0]]          


pairs3 = list(pair for pair in pairs(3))

print(pairs3)         

# [[0, 1], [2, 0], [1, 2], 

#  [0, 2], [1, 0], [2, 1]]


pairs4 = list(pair for pair in pairs(4))

print(pairs4)        

# [[0, 1], [2, 3], [1, 2], [3, 0],   <- diff = 1

#  [0, 2], [1, 3], [2, 0], [3, 1],   <- diff = 2

#  [0, 3], [2, 1], [1, 0], [3, 2]]   <- diff = 3


pairs5 = list(pair for pair in pairs(5))

print(pairs5)    

# [[0, 1], [2, 3], [4, 0], [1, 2], [3, 4],

#  [0, 2], [4, 1], [3, 0], [2, 4], [1, 3],

#  [0, 3], [1, 4], [2, 0], [3, 1], [4, 2],

#  [0, 4], [3, 2], [1, 0], [4, 3], [2, 1]]


# A check to verify that we get the right number of different pairs:

for n in range(100):

    pairs_n = set([tuple(pair) for pair in pairs(n)])

    assert len(pairs_n) == n*(n-1)

print('ok')

# ok


查看完整回答
反對 回復(fù) 2021-06-29
  • 1 回答
  • 0 關(guān)注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號