From 0b75e10dd9ea6835f7f27ca922a7d401fb152841 Mon Sep 17 00:00:00 2001 From: Himanshu Tomar Date: Sat, 29 Apr 2023 22:51:01 +0530 Subject: [PATCH 1/8] Added minimum waiting time problem solution using greedy algorithm --- DIRECTORY.md | 3 +- greedy_methods/minimum_waiting_time.py | 45 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 greedy_methods/minimum_waiting_time.py diff --git a/DIRECTORY.md b/DIRECTORY.md index 8e67c85c6fa8..dd14f1a58649 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -449,7 +449,8 @@ * [Fractional Knapsack](greedy_methods/fractional_knapsack.py) * [Fractional Knapsack 2](greedy_methods/fractional_knapsack_2.py) * [Optimal Merge Pattern](greedy_methods/optimal_merge_pattern.py) - + * [Minimum Waiting Time ](greedy_methods/minimum_waiting_time.py) + ## Hashes * [Adler32](hashes/adler32.py) * [Chaos Machine](hashes/chaos_machine.py) diff --git a/greedy_methods/minimum_waiting_time.py b/greedy_methods/minimum_waiting_time.py new file mode 100644 index 000000000000..a62edfb34510 --- /dev/null +++ b/greedy_methods/minimum_waiting_time.py @@ -0,0 +1,45 @@ +""" +This is a pure Python implementation for minimum waiting time problem using greedy algorithm +reference: https://www.youtube.com/watch?v=Sf3eiO12eJs + +For doctests run following command: +python -m doctest -v .\greedy_methods\minimum_waiting_time.py + +The minimum_waiting_time function uses a greedy algorithm to calculate the minimum time for queries to complete. +It sorts the list in non-decreasing order, calculates the waiting time for each query by multiplying its position +in the list with the sum of all remaining query times, and returns the total waiting time. A doctest ensures that +the function produces the correct output. +""" + + +def minimum_waiting_time(queries): + """ + This function takes a list of query times and returns the minimum waiting time + for all queries to be completed. + + >>> minimum_waiting_time([3, 2, 1, 2, 6]) + 17 + >>> minimum_waiting_time([3, 2, 1]) + 4 + >>> minimum_waiting_time([1, 2, 3, 4]) + 10 + """ + # Base case + n = len(queries) + if n == 0 or n == 1: + return 0 + + # Sort the list in non-decreasing order + queries.sort() + + # Calculate the total waiting time + total_waiting_time = 0 + for i in range(n - 1): + total_waiting_time += queries[i] * (n - i - 1) + + return total_waiting_time + + +if __name__ == '__main__': + import doctest + doctest.testmod() From 6520b7b1c0ab9cd1079360c270273c9da47bb84b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 29 Apr 2023 17:27:58 +0000 Subject: [PATCH 2/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- DIRECTORY.md | 2 +- greedy_methods/minimum_waiting_time.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/DIRECTORY.md b/DIRECTORY.md index dd14f1a58649..1a4ad8dcff85 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -450,7 +450,7 @@ * [Fractional Knapsack 2](greedy_methods/fractional_knapsack_2.py) * [Optimal Merge Pattern](greedy_methods/optimal_merge_pattern.py) * [Minimum Waiting Time ](greedy_methods/minimum_waiting_time.py) - + ## Hashes * [Adler32](hashes/adler32.py) * [Chaos Machine](hashes/chaos_machine.py) diff --git a/greedy_methods/minimum_waiting_time.py b/greedy_methods/minimum_waiting_time.py index a62edfb34510..e511a9ea685e 100644 --- a/greedy_methods/minimum_waiting_time.py +++ b/greedy_methods/minimum_waiting_time.py @@ -40,6 +40,7 @@ def minimum_waiting_time(queries): return total_waiting_time -if __name__ == '__main__': +if __name__ == "__main__": import doctest + doctest.testmod() From bd51b5a8da603c3b35e17595a0b6dbcf722e56bc Mon Sep 17 00:00:00 2001 From: Himanshu Tomar Date: Sat, 29 Apr 2023 23:09:30 +0530 Subject: [PATCH 3/8] ruff --fix --- greedy_methods/minimum_waiting_time.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/greedy_methods/minimum_waiting_time.py b/greedy_methods/minimum_waiting_time.py index a62edfb34510..4174e3792e4c 100644 --- a/greedy_methods/minimum_waiting_time.py +++ b/greedy_methods/minimum_waiting_time.py @@ -1,14 +1,16 @@ """ -This is a pure Python implementation for minimum waiting time problem using greedy algorithm +This is a pure Python implementation for minimum waiting time problem using greedy +algorithm. reference: https://www.youtube.com/watch?v=Sf3eiO12eJs For doctests run following command: -python -m doctest -v .\greedy_methods\minimum_waiting_time.py +python -m doctest -v minimum_waiting_time.py -The minimum_waiting_time function uses a greedy algorithm to calculate the minimum time for queries to complete. -It sorts the list in non-decreasing order, calculates the waiting time for each query by multiplying its position -in the list with the sum of all remaining query times, and returns the total waiting time. A doctest ensures that -the function produces the correct output. +The minimum_waiting_time function uses a greedy algorithm to calculate the minimum +time for queries to complete. It sorts the list in non-decreasing order, calculates +the waiting time for each query by multiplying its position in the list with the +sum of all remaining query times, and returns the total waiting time. A doctest +ensures that the function produces the correct output. """ From 0bd440e214b35800b5adec752bf77b5de2f74c2b Mon Sep 17 00:00:00 2001 From: Himanshu Tomar Date: Sat, 29 Apr 2023 23:16:50 +0530 Subject: [PATCH 4/8] Add type hints --- greedy_methods/minimum_waiting_time.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/greedy_methods/minimum_waiting_time.py b/greedy_methods/minimum_waiting_time.py index 1ad475052f7c..c20c12cb9011 100644 --- a/greedy_methods/minimum_waiting_time.py +++ b/greedy_methods/minimum_waiting_time.py @@ -14,11 +14,18 @@ """ -def minimum_waiting_time(queries): +def minimum_waiting_time(queries: list) -> int: """ This function takes a list of query times and returns the minimum waiting time for all queries to be completed. + Args: + queries [list]: A list of queries + + Returns: + total_waiting_time [int]: Minimum waiting time + + Examples: >>> minimum_waiting_time([3, 2, 1, 2, 6]) 17 >>> minimum_waiting_time([3, 2, 1]) From ac29bff0ceabea014012544cd0ee8d439eba4ab0 Mon Sep 17 00:00:00 2001 From: Himanshu Tomar Date: Sun, 30 Apr 2023 13:05:52 +0530 Subject: [PATCH 5/8] Added two more doc test --- greedy_methods/minimum_waiting_time.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/greedy_methods/minimum_waiting_time.py b/greedy_methods/minimum_waiting_time.py index c20c12cb9011..0cff23394337 100644 --- a/greedy_methods/minimum_waiting_time.py +++ b/greedy_methods/minimum_waiting_time.py @@ -32,6 +32,10 @@ def minimum_waiting_time(queries: list) -> int: 4 >>> minimum_waiting_time([1, 2, 3, 4]) 10 + >>> minimum_waiting_time([5, 5, 5, 5]) + 30 + >>> minimum_waiting_time([]) + 0 """ # Base case n = len(queries) From 8062a3ceec41cca41b7acca24f762bd38d9c9483 Mon Sep 17 00:00:00 2001 From: Himanshu Tomar Date: Mon, 1 May 2023 11:12:10 +0530 Subject: [PATCH 6/8] Removed unnecessary comments --- greedy_methods/minimum_waiting_time.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/greedy_methods/minimum_waiting_time.py b/greedy_methods/minimum_waiting_time.py index 0cff23394337..8d7bbc14fdbd 100644 --- a/greedy_methods/minimum_waiting_time.py +++ b/greedy_methods/minimum_waiting_time.py @@ -37,15 +37,13 @@ def minimum_waiting_time(queries: list) -> int: >>> minimum_waiting_time([]) 0 """ - # Base case + n = len(queries) if n == 0 or n == 1: return 0 - # Sort the list in non-decreasing order queries.sort() - # Calculate the total waiting time total_waiting_time = 0 for i in range(n - 1): total_waiting_time += queries[i] * (n - i - 1) From 27a0d4a0f5a488f284001ccea8bb81e28c2264a9 Mon Sep 17 00:00:00 2001 From: Himanshu Tomar Date: Mon, 1 May 2023 11:17:28 +0530 Subject: [PATCH 7/8] updated type hints --- greedy_methods/minimum_waiting_time.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/greedy_methods/minimum_waiting_time.py b/greedy_methods/minimum_waiting_time.py index 8d7bbc14fdbd..1125c6e30aa3 100644 --- a/greedy_methods/minimum_waiting_time.py +++ b/greedy_methods/minimum_waiting_time.py @@ -14,13 +14,13 @@ """ -def minimum_waiting_time(queries: list) -> int: +def minimum_waiting_time(queries: list[int]) -> int: """ This function takes a list of query times and returns the minimum waiting time for all queries to be completed. Args: - queries [list]: A list of queries + queries [list[int]]: A list of queries Returns: total_waiting_time [int]: Minimum waiting time From b2bf9886f7335cb22c08508d6244d6292bdad8be Mon Sep 17 00:00:00 2001 From: Himanshu Tomar Date: Mon, 1 May 2023 15:35:11 +0530 Subject: [PATCH 8/8] Updated the code as per the code review --- greedy_methods/minimum_waiting_time.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/greedy_methods/minimum_waiting_time.py b/greedy_methods/minimum_waiting_time.py index 1125c6e30aa3..aaae8cf8f720 100644 --- a/greedy_methods/minimum_waiting_time.py +++ b/greedy_methods/minimum_waiting_time.py @@ -1,6 +1,5 @@ """ -This is a pure Python implementation for minimum waiting time problem using greedy -algorithm. +Calculate the minimum waiting time using a greedy algorithm. reference: https://www.youtube.com/watch?v=Sf3eiO12eJs For doctests run following command: @@ -20,10 +19,10 @@ def minimum_waiting_time(queries: list[int]) -> int: for all queries to be completed. Args: - queries [list[int]]: A list of queries + queries: A list of queries measured in picoseconds Returns: - total_waiting_time [int]: Minimum waiting time + total_waiting_time: Minimum waiting time measured in picoseconds Examples: >>> minimum_waiting_time([3, 2, 1, 2, 6]) @@ -37,18 +36,10 @@ def minimum_waiting_time(queries: list[int]) -> int: >>> minimum_waiting_time([]) 0 """ - n = len(queries) - if n == 0 or n == 1: + if n in (0, 1): return 0 - - queries.sort() - - total_waiting_time = 0 - for i in range(n - 1): - total_waiting_time += queries[i] * (n - i - 1) - - return total_waiting_time + return sum(query * (n - i - 1) for i, query in enumerate(sorted(queries))) if __name__ == "__main__":