mirror of
https://github.com/logos-blockchain/logos-blockchain-specs.git
synced 2026-01-26 00:43:11 +00:00
29 lines
1.2 KiB
Python
29 lines
1.2 KiB
Python
def merge_committees(committees):
|
|
num_committees = len(committees)
|
|
merged_committees = []
|
|
|
|
# Sort the committees by size
|
|
sorted_committees = sorted(committees, key=len)
|
|
|
|
# Divide the committees into two groups: smaller and larger
|
|
smaller_committees = sorted_committees[:num_committees // 2]
|
|
larger_committees = sorted_committees[num_committees // 2:]
|
|
|
|
# Merge smaller and larger committees pairwise
|
|
for smaller, larger in zip(smaller_committees, larger_committees):
|
|
merged_committee = set(smaller)
|
|
merged_committee.update(larger)
|
|
merged_committees.append(merged_committee)
|
|
|
|
# Handle the leftover committee, if it exists
|
|
if num_committees % 2 == 1:
|
|
leftover_committee = set(sorted_committees[-1])
|
|
num_merged_committees = len(merged_committees)
|
|
|
|
# Distribute leftover members evenly among merged committees
|
|
for member in leftover_committee:
|
|
# Find the index of the merged committee with the smallest size
|
|
smallest_idx = min(range(num_merged_committees), key=lambda i: len(merged_committees[i]))
|
|
merged_committees[smallest_idx].add(member)
|
|
|
|
return merged_committees |