Skip to content

Commit d96e4a9

Browse files
author
Hamid Gasmi
committed
Issue #31 (Parallel processing) is completed
1 parent c2c9320 commit d96e4a9

File tree

1 file changed

+85
-0
lines changed
  • 2-data-sructures-fundamentals/3_priority_queues_and_disjoint_sets

1 file changed

+85
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
from collections import namedtuple
2+
3+
AssignedJob = namedtuple("AssignedJob", ["worker", "started_at"])
4+
5+
def leftChild(i, size):
6+
l = 2 * i + 1
7+
return l if l < size else -1
8+
9+
def rightChild(i, size):
10+
r = 2 * i + 2
11+
return r if r < size else -1
12+
13+
def IsHigherPriority(minHeap, i, j, size):
14+
15+
if j >= size or j < 0:
16+
return False
17+
if i >= size or i < 0:
18+
return False
19+
20+
if minHeap[i].started_at < minHeap[j].started_at:
21+
return True
22+
elif minHeap[i].started_at == minHeap[j].started_at and minHeap[i].worker < minHeap[j].worker:
23+
return True
24+
25+
return False
26+
27+
# Time Complexity: O(log J)
28+
# Space Complexity: O(1)
29+
def siftDown(minHeap, i, size):
30+
if i >= size:
31+
return
32+
33+
indexMin = i
34+
if IsHigherPriority(minHeap, leftChild(i, size), indexMin, size):
35+
indexMin = leftChild(i, size)
36+
37+
if IsHigherPriority(minHeap, rightChild(i, size), indexMin, size):
38+
indexMin = rightChild(i, size)
39+
40+
if indexMin != i:
41+
minHeap[i], minHeap[indexMin] = minHeap[indexMin], minHeap[i]
42+
siftDown(minHeap, indexMin, size)
43+
44+
# Time Complexity: O(N * log J)
45+
# Space Complexity: O(J)
46+
def assign_jobs(n_workers, jobs):
47+
result = []
48+
49+
#Build a MinHeap
50+
minHeapPriority = [AssignedJob(i, 0) for i in range(n_workers) ] # O(n)
51+
52+
for job in jobs: # O(j * log n)
53+
54+
result.append(AssignedJob(minHeapPriority[0].worker, minHeapPriority[0].started_at))
55+
minHeapPriority[0] = AssignedJob(minHeapPriority[0].worker, minHeapPriority[0].started_at + job)
56+
57+
# Sift Down the work which started_at time is just changed
58+
siftDown(minHeapPriority, 0, n_workers) # O(log n)
59+
60+
return result
61+
62+
# Time Complexity: O(N * J)
63+
# Space Complexity: O(J)
64+
def assign_jobs_brute(n_workers, jobs):
65+
result = []
66+
next_free_time = [0] * n_workers
67+
for job in jobs:
68+
next_worker = min(range(n_workers), key=lambda w: next_free_time[w])
69+
result.append(AssignedJob(next_worker, next_free_time[next_worker]))
70+
next_free_time[next_worker] += job
71+
72+
return result
73+
74+
def main():
75+
n_workers, n_jobs = map(int, input().split())
76+
jobs = list(map(int, input().split()))
77+
assert len(jobs) == n_jobs
78+
79+
assigned_jobs = assign_jobs(n_workers, jobs)
80+
81+
for job in assigned_jobs:
82+
print(job.worker, job.started_at)
83+
84+
if __name__ == "__main__":
85+
main()

0 commit comments

Comments
 (0)