Tất cả thử thách
Trung bình 0 đã giải Tỷ lệ chấp nhận 0%

Parallel Task Completion Order

Run tasks concurrently with at most k at a time and report the order in which they finish.

Bạn sẽ học được gì

  • Run tasks with a limit on parallelism
  • Simulate time with a priority queue
  • Break ties between tasks that finish together

Đề bài

Xem bản dịch

With async/await you can start several tasks and let them run at the same time. A SemaphoreSlim often caps how many run at once.

Tasks numbered 0 to n − 1 take durations[i] time units. At time 0 start as many tasks as the limit allows, in index order. Whenever tasks finish, record them (if several finish at the same moment, lower index first) and immediately start the next waiting tasks, in index order, to fill the free slots.

Implement parallel_task_order(durations, limit).

Input

durations: How long each task takes.

limit: The maximum number of tasks running at the same time.

Output

Return the task indices in the order they finish.

Ràng buộc

1 ≤ n ≤ 100,000

1 ≤ durations[i] ≤ 10^6; 1 ≤ limit ≤ n

Ví dụ

Ví dụ 1
Đầu vào:
limit = 2
durations = [4, 2, 3, 1]

Kết quả mong đợi:
expected = [1, 0, 2, 3]
Đầu vào:
long long limit = 2;
std::vector<long long> durations = {4, 2, 3, 1};

Kết quả mong đợi:
std::vector<long long> expected = {1, 0, 2, 3};
Đầu vào:
long limit = 2;
long[] durations = new long[] {4, 2, 3, 1};

Kết quả mong đợi:
long[] expected = new long[] {1, 0, 2, 3};

Giải thích

Tasks 0 and 1 start. Task 1 ends at 2 and task 2 starts (ends at 5). Task 0 ends at 4 and task 3 starts (ends at 5). Tasks 2 and 3 finish together, lower index first: [1, 0, 2, 3].

Ví dụ 2
Đầu vào:
limit = 3
durations = [3, 1, 2]

Kết quả mong đợi:
expected = [1, 2, 0]
Đầu vào:
long long limit = 3;
std::vector<long long> durations = {3, 1, 2};

Kết quả mong đợi:
std::vector<long long> expected = {1, 2, 0};
Đầu vào:
long limit = 3;
long[] durations = new long[] {3, 1, 2};

Kết quả mong đợi:
long[] expected = new long[] {1, 2, 0};

Giải thích

All tasks run at once and finish at 1, 2 and 3: [1, 2, 0].

Hướng tiếp cận

Hãy tự thử trước, sau đó mở từng gợi ý một.

Gợi ý 1

Keep the running tasks ordered by finish time, then by index.

Gợi ý 2

Each step jumps to the next finish time and collects every task ending then.

Gợi ý 3

Refill free slots with the next waiting tasks in index order.

Độ phức tạp mong đợi

O(n log limit) time, O(limit) extra space

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.