@ ব্লাস্টফর্নেসটি সঠিক পথে ছিল। পিভটগুলি ওজনের প্রান্তে যেখানে আপনি কুইকসিলিট ব্যবহার করেন। প্রতিটি পার্টিশন এক সেট লোককে একসেটে বিভক্ত করে এবং প্রতিটি সংখ্যক লোকের জন্য মোট ওজন দেয়। আপনার বালতি সর্বোচ্চ ওজনের লোকের সাথে সম্পর্কিত হওয়া পর্যন্ত আপনি যথাযথ বালতিটি ভাঙ্গতে অব্যাহত রাখেন এবং আপনার সেটে থাকা সর্বনিম্ন বালতিতে 1 জন ব্যক্তি রয়েছে (এটি আর কোনও অংশে বিভক্ত হতে পারে না))
এই অ্যালগরিদম লিনিয়ার টাইম ইমোর্টাইজড তবে চতুর্ভুজ খারাপের ক্ষেত্রে। আমি মনে করি এটি একমাত্র লিনিয়ার সময় অ্যালগরিদম ।
এখানে একটি পাইথন সমাধান রয়েছে যা এই অ্যালগরিদমকে চিত্রিত করে:
#!/usr/bin/env python
import math
import numpy as np
import random
OVERWEIGHT = 3000.0
in_trouble = [math.floor(x * 10) / 10
for x in np.random.standard_gamma(16.0, 100) * 8.0]
dead = []
spared = []
dead_weight = 0.0
while in_trouble:
m = np.median(list(set(random.sample(in_trouble, min(len(in_trouble), 5)))))
print("Partitioning with pivot:", m)
lighter_partition = []
heavier_partition = []
heavier_partition_weight = 0.0
in_trouble_is_indivisible = True
for p in in_trouble:
if p < m:
lighter_partition.append(p)
else:
heavier_partition.append(p)
heavier_partition_weight += p
if p != m:
in_trouble_is_indivisible = False
if heavier_partition_weight + dead_weight >= OVERWEIGHT and not in_trouble_is_indivisible:
spared += lighter_partition
in_trouble = heavier_partition
else:
dead += heavier_partition
dead_weight += heavier_partition_weight
in_trouble = lighter_partition
print("weight of dead people: {}; spared people: {}".format(
dead_weight, sum(spared)))
print("Dead: ", dead)
print("Spared: ", spared)
আউটপুট:
Partitioning with pivot: 121.2
Partitioning with pivot: 158.9
Partitioning with pivot: 168.8
Partitioning with pivot: 161.5
Partitioning with pivot: 159.7
Partitioning with pivot: 158.9
weight of dead people: 3051.7; spared people: 9551.7
Dead: [179.1, 182.5, 179.2, 171.6, 169.9, 179.9, 168.8, 172.2, 169.9, 179.6, 164.4, 164.8, 161.5, 163.1, 165.7, 160.9, 159.7, 158.9]
Spared: [82.2, 91.9, 94.7, 116.5, 108.2, 78.9, 83.1, 114.6, 87.7, 103.0, 106.0, 102.3, 104.9, 117.0, 96.7, 109.2, 98.0, 108.4, 99.0, 96.8, 90.7, 79.4, 101.7, 119.3, 87.2, 114.7, 90.0, 84.7, 83.5, 84.7, 111.0, 118.1, 112.1, 92.5, 100.9, 114.1, 114.7, 114.1, 113.7, 99.4, 79.3, 100.1, 82.6, 108.9, 103.5, 89.5, 121.8, 156.1, 121.4, 130.3, 157.4, 138.9, 143.0, 145.1, 125.1, 138.5, 143.8, 146.8, 140.1, 136.9, 123.1, 140.2, 153.6, 138.6, 146.5, 143.6, 130.8, 155.7, 128.9, 143.8, 124.0, 134.0, 145.0, 136.0, 121.2, 133.4, 144.0, 126.3, 127.0, 148.3, 144.9, 128.1]