From 94e629476f4742d6f73f2bde53c5f716b0ac5535 Mon Sep 17 00:00:00 2001 From: Sanket Date: Fri, 10 Jan 2020 23:24:45 +0530 Subject: [PATCH 01/18] Update A1_PS5_DC_21.py fixed warning as shown in pycharm --- dsad/A1_PS5_DC_21.py | 173 +++++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 88 deletions(-) diff --git a/dsad/A1_PS5_DC_21.py b/dsad/A1_PS5_DC_21.py index c40445c..acc0dd6 100644 --- a/dsad/A1_PS5_DC_21.py +++ b/dsad/A1_PS5_DC_21.py @@ -1,13 +1,14 @@ #!/usr/bin/env python3 -import re import copy +import re + class PatientRecord: """ Stores patient info. """ def __init__(self, age, name, Pid): - self.PatId = str(Pid) + str(age).rjust(2,'0') + self.PatId = str(Pid) + str(age).rjust(2, '0') self.name = name self.age = age self.left = None @@ -17,6 +18,69 @@ def __str__(self): """ debugging aid """ return "{}, {}, {}".format(self.name, self.age, self.PatId) + +def next_patient_banner(p): + """ Generate 'Next Patient' message. + + Return info about the next patient. + """ + + if p is None: + return "" + + return """---- next patient --------------- +Next patient for consultation is: {}, {} +---------------------------------------------- +""".format(p.PatId, p.name) + + +def _swap(n1, n2): + """ Swap two nodes. """ + + # It is easier to swap the values than all the links. + n1.age, n2.age = n2.age, n1.age + n1.name, n2.name = n2.name, n1.name + n1.PatId, n2.PatId = n2.PatId, n1.PatId + + +def _max(node1, node2): + """ Return the node having higher age value, + or None if both nodes do not exist. + """ + + if node1 is None and node2 is None: + return None + + if node1 is None: + return node2 + if node2 is None: + return node1 + + if node1.age > node2.age: + return node1 + else: + return node2 + + +def read_in2(): + """ Read the second input file, line by line. """ + + infile = 'inputPS5b.txt' + with open(infile, "r") as f: + for line in f: + yield line + return + + +def write_out2(file): + """ Write/append to second output file. """ + + outfile = 'outputPS5.txt' + with open(outfile, "a+") as f: + f.write(file) + return + + class ConsultQueue: """ Build the Consult Queue as a max heap tree. For every new patient, the patient id is generated and @@ -24,11 +88,10 @@ class ConsultQueue: """ initial_pid = pid = 1000 # patient counter (initial value.) - register = dict() # provide easy mapping b/w patId and patient node. - queue = list() # stores the max heap tree - queue2 = list() # duplicate list, preserves the original heap for reconstruction. - root = None # heap tree's root - + register = dict() # provide easy mapping b/w patId and patient node. + queue = list() # stores the max heap tree + queue2 = list() # duplicate list, preserves the original heap for reconstruction. + root = None # heap tree's root def registerPatient(self, name, age): """ Register a patient node. @@ -38,12 +101,11 @@ def registerPatient(self, name, age): Return newly added patient node. """ - patid = self._generate_pat_id(name, age) + patid = self._generate_pat_id() patient = PatientRecord(age, name, patid) self.register[patid] = patient return self.enqueuePatient(patid) - def enqueuePatient(self, PatId): """ Add patient node to max heap. @@ -53,7 +115,6 @@ def enqueuePatient(self, PatId): patient = self.register[PatId] return self._heap_add(patient) - def nextPatient(self): """ Remove next patient from the heap. @@ -62,12 +123,11 @@ def nextPatient(self): if self.root is not None: # dequeue root and heapify the tree again. - return self._dequeuePatient(self.root.PatId) + return self._dequeuePatient() else: return "" - - def _dequeuePatient(self, patid=None): + def _dequeuePatient(self): """ Remove next patient from the heap. Argument: patId (unused, as we do not remove arbitrary patient node but always the one from the heap's root.) @@ -77,7 +137,6 @@ def _dequeuePatient(self, patid=None): """ return self._heap_remove() - def new_patient_banner(self, p): """ Generate 'New Patient' message. Return info about the new patient. @@ -90,23 +149,7 @@ def new_patient_banner(self, p): ---------------------------------------------- """.format(p.name, p.age, p.PatId, self._heap_items().rstrip()) - - def next_patient_banner(self, p): - """ Generate 'Next Patient' message. - - Return info about the next patient. - """ - - if p is None: - return "" - - return """---- next patient --------------- -Next patient for consultation is: {}, {} ----------------------------------------------- -""".format(p.PatId, p.name) - - - def _generate_pat_id(self, age, name): + def _generate_pat_id(self): """ Generate patient id in form. Return Patient Id. @@ -117,33 +160,6 @@ def _generate_pat_id(self, age, name): patid = str(self.pid).rjust(4, '0') return patid - - def _swap(self, n1, n2): - """ Swap two nodes. """ - - # It is easier to swap the values than all the links. - n1.age, n2.age = n2.age, n1.age - n1.name, n2.name = n2.name, n1.name - n1.PatId, n2.PatId = n2.PatId, n1.PatId - - def _max(self, node1, node2): - """ Return the node having higher age value, - or None if both nodes do not exist. - """ - - if node1 is None and node2 is None: - return None - - if node1 is None: - return node2 - if node2 is None: - return node1 - - if node1.age > node2.age: - return node1 - else: - return node2 - def _heap_add(self, node): """ Add a node to max heap tree and heapify the tree. """ @@ -154,7 +170,7 @@ def _heap_add(self, node): return node # if heap is not-empty, find the (expected) parent of the new node. - parent = self.queue[len(self.queue) // 2 -1] + parent = self.queue[len(self.queue) // 2 - 1] # connect the new node to parent's left/right, whichever available. if parent.left is None: @@ -179,13 +195,13 @@ def _heap_remove(self): # before swapping, remove parent->last_node pointer. last_node = self.queue[-1] - parent = self.queue[len(self.queue)//2 -1] + parent = self.queue[len(self.queue) // 2 - 1] if parent.left is last_node: parent.left = None else: parent.right = None - self._swap(self.root, last_node) + _swap(self.root, last_node) root = self.queue.pop(-1) self._heapify_top_down() @@ -197,12 +213,12 @@ def _heapify_bottom_up(self, node): Return the original node. """ - parent_pos = len(self.queue) // 2 -1 + parent_pos = len(self.queue) // 2 - 1 parent = self.queue[parent_pos] while parent is not None and parent.age < node.age: - self._swap(parent, node) - node = parent # move up and compare again + _swap(parent, node) + node = parent # move up and compare again # calculate current node's parent, special handling for root. parent_pos = parent_pos // 2 - 1 @@ -220,11 +236,11 @@ def _heapify_top_down(self): node = self.root while node is not None: - child = self._max(node.left, node.right) + child = _max(node.left, node.right) # if current node's age value is smaller than one of it's child, # swap with larger child. if child is not None and node.age < child.age: - self._swap(node, child) + _swap(node, child) node = child else: break @@ -253,7 +269,6 @@ def _heap_items(self): return output - def read_in1(self): """ Read initial input file and register the patients. """ @@ -281,26 +296,8 @@ def write_out1(self): f.write(text) return - def read_in2(self): - """ Read the second input file, line by line. """ - - infile = 'inputPS5b.txt' - with open(infile, "r") as f: - for line in f: - yield line - return - - def write_out2(self, str): - """ Write/append to second output file. """ - - outfile = 'outputPS5.txt' - with open(outfile, "a+") as f: - f.write(str) - return - def main(): - # create the initial queue from infile1 cq = ConsultQueue() cq.read_in1() @@ -309,7 +306,7 @@ def main(): cq.write_out1() # enqueue new patients from infile2. - for line in cq.read_in2(): + for line in read_in2(): # we expect either a 'New patient' with name/age info # or the 'Next Patient' command if re.match('^newPatient:', line): @@ -319,10 +316,10 @@ def main(): age = int(age) patient = cq.registerPatient(name, age) - cq.write_out2(cq.new_patient_banner(patient)) + write_out2(cq.new_patient_banner(patient)) elif re.match('^nextPatient', line): patient = cq.nextPatient() - cq.write_out2(cq.next_patient_banner(patient)) + write_out2(next_patient_banner(patient)) main() From e0a779846e5fd943ffe887dcfee26a10651615d4 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sat, 11 Jan 2020 22:31:34 +0530 Subject: [PATCH 02/18] log error message on nextPatient call with empty queue --- dsad/A1_PS5_DC_21.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsad/A1_PS5_DC_21.py b/dsad/A1_PS5_DC_21.py index 4e87e13..865bb88 100644 --- a/dsad/A1_PS5_DC_21.py +++ b/dsad/A1_PS5_DC_21.py @@ -26,7 +26,7 @@ def next_patient_banner(p): """ if p is None: - return "" + return "ERROR: Patient queue is empty.\n" return """---- next patient --------------- Next patient for consultation is: {}, {} From 3e72bb0498c1e7fbc565d390f6fd9d2c3deacfd1 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 07:21:05 +0530 Subject: [PATCH 03/18] cosmetic changes --- dsad/A1_PS5_DC_21.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsad/A1_PS5_DC_21.py b/dsad/A1_PS5_DC_21.py index 865bb88..c276070 100644 --- a/dsad/A1_PS5_DC_21.py +++ b/dsad/A1_PS5_DC_21.py @@ -26,7 +26,7 @@ def next_patient_banner(p): """ if p is None: - return "ERROR: Patient queue is empty.\n" + return "Patient queue is empty.\n" return """---- next patient --------------- Next patient for consultation is: {}, {} From 1ac4792d95c2562809dc7d94059e366b906f6b87 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 13:33:55 +0530 Subject: [PATCH 04/18] adding analysis file --- dsad/analysisPS5.txt | 223 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100644 dsad/analysisPS5.txt diff --git a/dsad/analysisPS5.txt b/dsad/analysisPS5.txt new file mode 100644 index 0000000..f261514 --- /dev/null +++ b/dsad/analysisPS5.txt @@ -0,0 +1,223 @@ +Analysis of Assignment 5 +======================== + + +Program logic +-=-=-=-=-=-=- + + Populating Initial ConsultQueue + -------------------------------- + + The programs implements a priority queue via a max-heap tree, which is + built one node at a time with the given initial list of patients. The + tree is heapified using the bottom-up approach, each time a patient node + is inserted. + + The max-heap is implemented with a python list, which makes it easier to + reach to any node's parent using its index. The list also allows for + arbitrarily large number of nodes to be inserted, the upper bound on the + number of nodes is limited only by system's available memory. + + + Refreshing the Queue + -------------------- + + Once the heap tree is populated with the given list of initial list of + patients, the queue is refreshed, which means the heap tree is printed + in non-decreasing order of patient's age. Printing a heap tree requires + that the elements of the tree are removed one by one, with max-heap + being heapified after every deletion. The deletion uses the strategy of + swapping the last node with heap tree's root (patient node with highest + age), and then heapifying the tree again using top-down heapify + approach. The original root node is removed from the tree (python list) + and the process is repeated till the queue is empty. + + Since the printing of sorted ConsultQueue requires emptying out of the + original queue, we need to keep a copy of the ConsultQueue for later + restoration of the heap-tree, so that the tree can be refreshed / + printed again, once a new patient is registered. + + + Patient Registration + -------------------- + + Every time a new patient is added to the ConsultQueue, the heap-tree is + heapified using the bottom-up heapify approach. + + + Next Patient + ------------ + + A nextPatient command deletes the patient node from the root of the heap + tree using top-down heapify approach. + + + +Time complexity +-=-=-=-=-=-=-=- + + Building initial ConsultQueue + ----------------------------- + + Initially, if the number of patients having arrived at clinic is 'm' the + time complexity to build the initial ConsultQueue is: + + O(m * log m) + + Once the ConsultQueue is built, it needs to be refreshed / printed, + which incurs an additional + + O(m * log m) complexity. + + + Subsequent New Patients + ----------------------- + + If there are 'n' newPatient commands (means, 'n' new patient arrive + subsequently (while none of the original 'm' patients are removed from + the priority queue, the total size of the max-heap grows to n + m. The + time complexity of insertion for 'n' new nodes is: + + O(n * log (m+n)) + + + ConsultQueue refresh + -------------------- + + However, as the ConsultQueue needs to be refreshed and restored after + each new patiend node is inserted, the complexity for refreshing + ConsultQueue *once* is: + + Time complexity of sorting (m+n) elements + Time complexity of backing + up original queue + Time complexity of restoring the queue. + + = O((m+n) * log(m+n)) + O(m+n) + O(1) = O((m+n) * + log(m+n)) + + For 'n' newPatient commands, the complexity becomes: O(n* (m+n) * + log(m+n)) + + + Next Patient + ------------ + + A patient node is deleted, and tree is heapified. + + The heapification is done in: O (log (m+n)) time (assuming the total + queue size is (m+n). + + If there are 'p' nextPatient commanads, the complexity of deleting 'p' + nodes and heapifying the tree becomes: + + O(p * log(m+n)) + + NextPatient command does not require the queue to be printed, so no + additional complexity is incurred. + + + --------------------- + Total Time Complexity + --------------------- + + The total time complexity can be obtained by summing up all the + individual time complexities above: + + 2*O(m * log m) + O(n * (m+n) * log(m+n)) + O(p * log(m+n)) + + with m, n and p being arbitrarily large numbers approaching N, the + upper-bound for the total time complexity can be given by: + + O(N^2 * log(N)) + --------------- + + +Space complexity +-=-=-=-=-=-=-=-= + + The program uses the following structures to store / implement the max + heap tree as a priority queue. + + queue - A python list structure that stores the max-heap tree. + + Space complexity incurred by 'queue' strcuture is: + + O(m+n) + here, 'm' being the count of initial patients, and 'n' + patients are added subsequently. + + + queue2 - Another python list structure to back up the 'queue' contents + before refreshing, and restore the original heap tree subsequently. + + Space complexity incurred by 'queue2' strcuture is also: + + O(m+n) + + + register - A python dict structure to map the patient id to patient + nodes. This one is *not* required if we choose to pass patient info + using PatientRecord node, instead of patient id. However, as the + skeleton program of problem expects to pass patient-id to + _enqueuePatient instead of PatientRecord, we need a mapping + structure to get the correct PatientRecord node. + + Space complexity incurred by 'register' strcuture is also: + + O(m+n) + + + ---------------------- + Total space Complexity + ---------------------- + + The total space complexity can be obtained by summing up all the + individual space complexities above: + + 3 * O(m + n) = O(m + n) + + which can be considered as + + O(N) + N being the total number of the patients. + + +Further Optimization and Takeaways +-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + + - A max heap tree is not a suitable structure where one needs to print + the sorted list frequently. As the full sorted list can only be obtained + after removing all elements one by one, this incurs O(n*logn) + complexity for every print operation. + A structure such as a binary search tree is a better fit in such cases, + which can provide a sorted list in O(n) time, thus reducing the total + time complexity for 'm' sorted-print operations to + O(mn) instead of the current O(mn logn). + + - max heap can be built in O(n) time complexity when all the initial n + nodes are given. This approach uses only non-lead nodes for + heapification, starting from the lowest level of the initial level-order + tree. + The current implementation builds the tree one element at a time, + and incurs O(n logn) for heap building. + This can be improved. + + - An ideal solution to the given problem would be by making use of an + *additional* binary search tree for printing the sorted list. This comes + at the cost of an additional O(n) space complexity. + + In this case - + + * Each new node would be added to both the heap tree and BST with + O(logn) time complexity. + + * A deletion would cause the node to be deleted from both heap and + BST with O(logn) time complexity. + + * Printing a list would print the sorted list by traversing BST only, + with O(n) time complexity, thus 'm' print operations would require O(mn) + complexity. + + * Additionally, we would not require a backup queue to preserve original + heap tree, as the sorted print happens only through BST; thereby + cancelling out the added space complexity of maintaining a BST. + From c657a301171d46e7399eccce800555e2297ecd72 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 14:32:34 +0530 Subject: [PATCH 05/18] cosmetic --- dsad/analysisPS5.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dsad/analysisPS5.txt b/dsad/analysisPS5.txt index f261514..085d8bd 100644 --- a/dsad/analysisPS5.txt +++ b/dsad/analysisPS5.txt @@ -73,8 +73,8 @@ Time complexity Subsequent New Patients ----------------------- - If there are 'n' newPatient commands (means, 'n' new patient arrive - subsequently (while none of the original 'm' patients are removed from + If there are 'n' newPatient commands ('n' new patient arrive + subsequently) while none of the original 'm' patients are removed from the priority queue, the total size of the max-heap grows to n + m. The time complexity of insertion for 'n' new nodes is: @@ -207,8 +207,8 @@ Further Optimization and Takeaways In this case - - * Each new node would be added to both the heap tree and BST with - O(logn) time complexity. + * Each new node would be added to both the heap tree and BST with + O(logn) time complexity. * A deletion would cause the node to be deleted from both heap and BST with O(logn) time complexity. From 87e4689570c8a8337a21097736e625a0d0eb026e Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 14:36:31 +0530 Subject: [PATCH 06/18] cosmetic --- dsad/analysisPS5.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dsad/analysisPS5.txt b/dsad/analysisPS5.txt index 085d8bd..c204c6b 100644 --- a/dsad/analysisPS5.txt +++ b/dsad/analysisPS5.txt @@ -103,7 +103,7 @@ Time complexity A patient node is deleted, and tree is heapified. - The heapification is done in: O (log (m+n)) time (assuming the total + The heapification is done in: O (log (m+n)) time, assuming the total queue size is (m+n). If there are 'p' nextPatient commanads, the complexity of deleting 'p' @@ -194,7 +194,7 @@ Further Optimization and Takeaways O(mn) instead of the current O(mn logn). - max heap can be built in O(n) time complexity when all the initial n - nodes are given. This approach uses only non-lead nodes for + nodes are given. This approach uses only non-leaf nodes for heapification, starting from the lowest level of the initial level-order tree. The current implementation builds the tree one element at a time, From 5d7600550d07c131a954e05d542f03691b600885 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 14:46:11 +0530 Subject: [PATCH 07/18] cosmetic --- dsad/analysisPS5.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dsad/analysisPS5.txt b/dsad/analysisPS5.txt index c204c6b..7f8bf5e 100644 --- a/dsad/analysisPS5.txt +++ b/dsad/analysisPS5.txt @@ -22,9 +22,9 @@ Program logic Refreshing the Queue -------------------- - Once the heap tree is populated with the given list of initial list of - patients, the queue is refreshed, which means the heap tree is printed - in non-decreasing order of patient's age. Printing a heap tree requires + Once the heap tree is populated with the given list of initial patients, + the queue is refreshed, which means the heap tree is printed in + non-decreasing order of patient's age. Printing a heap tree requires that the elements of the tree are removed one by one, with max-heap being heapified after every deletion. The deletion uses the strategy of swapping the last node with heap tree's root (patient node with highest From 41bbe44437cf379e94c48605055f31747c226357 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 14:53:13 +0530 Subject: [PATCH 08/18] cosmetic --- dsad/analysisPS5.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsad/analysisPS5.txt b/dsad/analysisPS5.txt index 7f8bf5e..00876cd 100644 --- a/dsad/analysisPS5.txt +++ b/dsad/analysisPS5.txt @@ -24,7 +24,7 @@ Program logic Once the heap tree is populated with the given list of initial patients, the queue is refreshed, which means the heap tree is printed in - non-decreasing order of patient's age. Printing a heap tree requires + non-increasing order of patient's age. Printing a heap tree requires that the elements of the tree are removed one by one, with max-heap being heapified after every deletion. The deletion uses the strategy of swapping the last node with heap tree's root (patient node with highest From c90a3f9fce171b432ff86169369ce4ee23e731f7 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 15:08:45 +0530 Subject: [PATCH 09/18] cosmetic --- dsad/analysisPS5.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/dsad/analysisPS5.txt b/dsad/analysisPS5.txt index 00876cd..b00ce00 100644 --- a/dsad/analysisPS5.txt +++ b/dsad/analysisPS5.txt @@ -28,9 +28,9 @@ Program logic that the elements of the tree are removed one by one, with max-heap being heapified after every deletion. The deletion uses the strategy of swapping the last node with heap tree's root (patient node with highest - age), and then heapifying the tree again using top-down heapify - approach. The original root node is removed from the tree (python list) - and the process is repeated till the queue is empty. + age), and then heapifying the tree using top-down heapify approach. + The original root node is removed from the tree (python list) and the + process is repeated till the queue is empty. Since the printing of sorted ConsultQueue requires emptying out of the original queue, we need to keep a copy of the ConsultQueue for later @@ -64,8 +64,8 @@ Time complexity O(m * log m) - Once the ConsultQueue is built, it needs to be refreshed / printed, - which incurs an additional + Upon building the initial ConsultQueue, it needs to be refreshed / printed + *one time*, incurring an additional: O(m * log m) complexity. @@ -85,7 +85,7 @@ Time complexity -------------------- However, as the ConsultQueue needs to be refreshed and restored after - each new patiend node is inserted, the complexity for refreshing + each new patient node is inserted, the complexity for refreshing ConsultQueue *once* is: Time complexity of sorting (m+n) elements + Time complexity of backing @@ -106,12 +106,12 @@ Time complexity The heapification is done in: O (log (m+n)) time, assuming the total queue size is (m+n). - If there are 'p' nextPatient commanads, the complexity of deleting 'p' + If there are 'p' nextPatient commands, the complexity of deleting 'p' nodes and heapifying the tree becomes: O(p * log(m+n)) - NextPatient command does not require the queue to be printed, so no + nextPatient command does not require the queue to be printed, so no additional complexity is incurred. @@ -139,7 +139,7 @@ Space complexity queue - A python list structure that stores the max-heap tree. - Space complexity incurred by 'queue' strcuture is: + Space complexity incurred by 'queue' structure is: O(m+n) here, 'm' being the count of initial patients, and 'n' @@ -149,7 +149,7 @@ Space complexity queue2 - Another python list structure to back up the 'queue' contents before refreshing, and restore the original heap tree subsequently. - Space complexity incurred by 'queue2' strcuture is also: + Space complexity incurred by 'queue2' structure is also: O(m+n) @@ -161,7 +161,7 @@ Space complexity _enqueuePatient instead of PatientRecord, we need a mapping structure to get the correct PatientRecord node. - Space complexity incurred by 'register' strcuture is also: + Space complexity incurred by 'register' structure is also: O(m+n) @@ -219,5 +219,5 @@ Further Optimization and Takeaways * Additionally, we would not require a backup queue to preserve original heap tree, as the sorted print happens only through BST; thereby - cancelling out the added space complexity of maintaining a BST. + canceling out the added space complexity of maintaining a BST. From 53b4b9ba98e34e8ea2eb628c45d38b84a5bab323 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 18:16:27 +0530 Subject: [PATCH 10/18] output file --- dsad/outputPS5.txt | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 dsad/outputPS5.txt diff --git a/dsad/outputPS5.txt b/dsad/outputPS5.txt new file mode 100644 index 0000000..f8f500e --- /dev/null +++ b/dsad/outputPS5.txt @@ -0,0 +1,42 @@ +---- initial queue --------------- +No of patients added: 3 +Refreshed queue: +100160, Surya +100327, Rishi +100214, Ajay +---------------------------------------------- +---- new patient entered --------------- +Patient details: John, 55, 100455 +Refreshed queue: +100160, Surya +100455, John +100327, Rishi +100214, Ajay +---------------------------------------------- +---- next patient --------------- +Next patient for consultation is: 100160, Surya +---------------------------------------------- +---- new patient entered --------------- +Patient details: Pradeep, 45, 100545 +Refreshed queue: +100455, John +100545, Pradeep +100327, Rishi +100214, Ajay +---------------------------------------------- +---- next patient --------------- +Next patient for consultation is: 100455, John +---------------------------------------------- +---- next patient --------------- +Next patient for consultation is: 100545, Pradeep +---------------------------------------------- +---- new patient entered --------------- +Patient details: Sandeep, 60, 100660 +Refreshed queue: +100660, Sandeep +100327, Rishi +100214, Ajay +---------------------------------------------- +---- next patient --------------- +Next patient for consultation is: 100660, Sandeep +---------------------------------------------- From f31d06df31fa7199817940120e0e7c1e6fe643ac Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 12 Jan 2020 18:21:04 +0530 Subject: [PATCH 11/18] final deliverables --- dsad/ASSIGNMENT1_PUN_B1_G21.zip | Bin 0 -> 6783 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dsad/ASSIGNMENT1_PUN_B1_G21.zip diff --git a/dsad/ASSIGNMENT1_PUN_B1_G21.zip b/dsad/ASSIGNMENT1_PUN_B1_G21.zip new file mode 100644 index 0000000000000000000000000000000000000000..2fd20f41288c96021a97bcaa49a3066ca68dbab5 GIT binary patch literal 6783 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 literal 0 HcmV?d00001 From 1b840da18a6448fa735ac3d395c6a511756eb736 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sat, 1 Feb 2020 15:52:59 +0530 Subject: [PATCH 12/18] fixed miscalculation in parent node position. --- dsad/A1_PS5_DC_21.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsad/A1_PS5_DC_21.py b/dsad/A1_PS5_DC_21.py index c276070..500eacf 100644 --- a/dsad/A1_PS5_DC_21.py +++ b/dsad/A1_PS5_DC_21.py @@ -226,7 +226,7 @@ def _heapify_bottom_up(self, node): node = parent # move up and compare again # calculate current node's parent's index, special handling for root. - parent_pos = parent_pos // 2 - 1 + parent_pos = (parent_pos-1) // 2 if parent_pos < 0: parent_pos = 0 parent = self.queue[parent_pos] From 24e9c4b55128f661f7042408cee5e7612497e638 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 2 Feb 2020 21:47:24 +0530 Subject: [PATCH 13/18] dsad assignment-2, initial checkin --- dsad-2/AS2_PS5_MS_21.py | 110 ++++++++++++++++++++ dsad-2/inputPS5.txt | 1 + dsad-2/inputPS5__ascending_price.txt | 11 ++ dsad-2/inputPS5__days_starting_from_one.txt | 7 ++ dsad-2/inputPS5__descending_price.txt | 11 ++ dsad-2/inputPS5__missing_day_number.txt | 5 + dsad-2/inputPS5__multiple_possibilities.txt | 9 ++ dsad-2/inputPS5__no_change_in_price.txt | 4 + dsad-2/inputPS5__sample.txt | 17 +++ dsad-2/inputPS5__too_few_entries.txt | 1 + dsad-2/outputPS5.txt | 1 + 11 files changed, 177 insertions(+) create mode 100644 dsad-2/AS2_PS5_MS_21.py create mode 100644 dsad-2/inputPS5.txt create mode 100644 dsad-2/inputPS5__ascending_price.txt create mode 100644 dsad-2/inputPS5__days_starting_from_one.txt create mode 100644 dsad-2/inputPS5__descending_price.txt create mode 100644 dsad-2/inputPS5__missing_day_number.txt create mode 100644 dsad-2/inputPS5__multiple_possibilities.txt create mode 100644 dsad-2/inputPS5__no_change_in_price.txt create mode 100644 dsad-2/inputPS5__sample.txt create mode 100644 dsad-2/inputPS5__too_few_entries.txt create mode 100644 dsad-2/outputPS5.txt diff --git a/dsad-2/AS2_PS5_MS_21.py b/dsad-2/AS2_PS5_MS_21.py new file mode 100644 index 0000000..f876efe --- /dev/null +++ b/dsad-2/AS2_PS5_MS_21.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 + +import re + + +def _max_subarray_lr(lst, low, mid, high): + left_total = 0 + max_left = max_right = 0 + current_total = 0 + for i in range(mid, low-1, -1): + current_total += lst[i].get('profit') + if current_total > left_total: + left_total = current_total + max_left = i + + right_total = 0 + current_total = 0 + for i in range(mid+1, high+1, 1): + current_total += lst[i].get('profit') + if current_total > right_total: + right_total = current_total + max_right = i + + return left_total+right_total, max_left, max_right + + +def maxProfit_divide_conquer(lst, low, high): + if low == high: + return lst[low].get('profit'), low, high + else: + mid = (low + high) // 2 + left_total, left_low, left_high = maxProfit_divide_conquer(lst, low, mid) + right_total, right_low, right_high = maxProfit_divide_conquer(lst, mid+1, high) + lr_total, lr_low, lr_high = _max_subarray_lr(lst, low, mid, high) + + if left_total >= right_total and left_total >= lr_total: + return left_total, left_low, left_high + elif right_total >= left_total and right_total >= lr_total: + return right_total, right_low, right_high + else: + return lr_total, lr_low, lr_high + + +def maxProfit_iterative(lst): + profit = 0 + buy_day = min_day = 0 + sell_day = 1 + + for i in range(1, len(lst)): + if lst[i].get('price') - lst[min_day].get('price') > profit: + profit = lst[i].get('price') - lst[min_day].get('price') + sell_day = i + buy_day = min_day + if lst[i].get('price') <= lst[min_day].get('price'): + min_day = i + + return profit, buy_day, sell_day + + + +def main(): + + infile = 'inputPS5.txt' + lst = list() + + with open(infile, "r") as f: + for line in f: + if re.match('[0-9]+ */ *[0-9]+', line): + (day, price) = re.split(r' */ *', line.rstrip()) + day = int(day) + price = int(price) + lst.append({'day': day, 'price': price, 'profit': 0}) + + for i in range(1, len(lst)): + lst[i]['profit'] = lst[i].get('price') - lst[i-1].get('price') + + + outfile = 'outputPS5.txt' + with open(outfile, 'w+') as f: + + # some checks. + if len(lst) < 2: + f.write("ERROR: Too few entries.\n") + return + + + # find maximum subarray for divide and conquer approach. + # buy_day will be 1 day before the first profit day. + (profit_by_dc, profit_start_day, profit_end_day) = maxProfit_divide_conquer(lst, 0, len(lst)-1) + + # find maximum profit with iterative approach. + (profit_by_iter, buy_day, sell_day) = maxProfit_iterative(lst) + + assert(profit_by_dc == profit_by_iter) + + if profit_by_dc <= 0: + f.write("NOTICE: No profit can be earned by buying and selling a stock.\n") + else: + f.write("""Maximum Profit(Divide & Conquer): {} +Day to buy: {} +Day to sell: {} +""".format(profit_by_dc, lst[profit_start_day-1].get('day'), lst[profit_end_day].get('day'))) + + f.write("""Maximum Profit(Iterative Solution): {} +Day to buy: {} +Day to sell: {} +""".format(profit_by_iter, lst[buy_day].get('day'), lst[sell_day].get('day'))) + + +main() diff --git a/dsad-2/inputPS5.txt b/dsad-2/inputPS5.txt new file mode 100644 index 0000000..9c5f10f --- /dev/null +++ b/dsad-2/inputPS5.txt @@ -0,0 +1 @@ +0 / 100 \ No newline at end of file diff --git a/dsad-2/inputPS5__ascending_price.txt b/dsad-2/inputPS5__ascending_price.txt new file mode 100644 index 0000000..8c7cc72 --- /dev/null +++ b/dsad-2/inputPS5__ascending_price.txt @@ -0,0 +1,11 @@ +0 / 100 +1 / 101 +2 / 102 +3 / 103 +4 / 104 +5 / 105 +6 / 106 +7 / 107 +8 / 108 +9 / 109 +10 / 110 \ No newline at end of file diff --git a/dsad-2/inputPS5__days_starting_from_one.txt b/dsad-2/inputPS5__days_starting_from_one.txt new file mode 100644 index 0000000..34c9adf --- /dev/null +++ b/dsad-2/inputPS5__days_starting_from_one.txt @@ -0,0 +1,7 @@ +1 / 1 +2 / 10 +3 / 100 +4 / 1000 +5 / 100 +6 / 10 +7 / 1 \ No newline at end of file diff --git a/dsad-2/inputPS5__descending_price.txt b/dsad-2/inputPS5__descending_price.txt new file mode 100644 index 0000000..c960634 --- /dev/null +++ b/dsad-2/inputPS5__descending_price.txt @@ -0,0 +1,11 @@ +0 / 100 +1 / 99 +2 / 98 +3 / 97 +4 / 96 +5 / 95 +6 / 94 +7 / 93 +8 / 92 +9 / 91 +10 / 90 \ No newline at end of file diff --git a/dsad-2/inputPS5__missing_day_number.txt b/dsad-2/inputPS5__missing_day_number.txt new file mode 100644 index 0000000..7077bd2 --- /dev/null +++ b/dsad-2/inputPS5__missing_day_number.txt @@ -0,0 +1,5 @@ +1 / 1 +2 / 10 +5 / 100 +6 / 10 +7 / 1 \ No newline at end of file diff --git a/dsad-2/inputPS5__multiple_possibilities.txt b/dsad-2/inputPS5__multiple_possibilities.txt new file mode 100644 index 0000000..f9595af --- /dev/null +++ b/dsad-2/inputPS5__multiple_possibilities.txt @@ -0,0 +1,9 @@ +0 / 100 +1 / 100 +2 / 100 +3 / 101 +4 / 100 +5 / 100 +6 / 101 +7 / 101 +8 / 101 \ No newline at end of file diff --git a/dsad-2/inputPS5__no_change_in_price.txt b/dsad-2/inputPS5__no_change_in_price.txt new file mode 100644 index 0000000..d25e118 --- /dev/null +++ b/dsad-2/inputPS5__no_change_in_price.txt @@ -0,0 +1,4 @@ +0 / 100 +1 / 100 +2 / 100 +3 / 100 \ No newline at end of file diff --git a/dsad-2/inputPS5__sample.txt b/dsad-2/inputPS5__sample.txt new file mode 100644 index 0000000..885ae86 --- /dev/null +++ b/dsad-2/inputPS5__sample.txt @@ -0,0 +1,17 @@ +0 / 100 +1 / 113 +2 / 110 +3 / 85 +4 / 105 +5 / 102 +6 / 86 +7 / 63 +8 / 81 +9 / 101 +10 / 94 +11 / 106 +12 / 101 +13 / 79 +14 / 94 +15 / 90 +16 / 97 diff --git a/dsad-2/inputPS5__too_few_entries.txt b/dsad-2/inputPS5__too_few_entries.txt new file mode 100644 index 0000000..9c5f10f --- /dev/null +++ b/dsad-2/inputPS5__too_few_entries.txt @@ -0,0 +1 @@ +0 / 100 \ No newline at end of file diff --git a/dsad-2/outputPS5.txt b/dsad-2/outputPS5.txt new file mode 100644 index 0000000..198778c --- /dev/null +++ b/dsad-2/outputPS5.txt @@ -0,0 +1 @@ +ERROR: Too few entries. From f05e8ad65004e9b16b2816dcad00304656df94a3 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 2 Feb 2020 22:47:56 +0530 Subject: [PATCH 14/18] default input file --- dsad-2/inputPS5.txt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/dsad-2/inputPS5.txt b/dsad-2/inputPS5.txt index 9c5f10f..885ae86 100644 --- a/dsad-2/inputPS5.txt +++ b/dsad-2/inputPS5.txt @@ -1 +1,17 @@ -0 / 100 \ No newline at end of file +0 / 100 +1 / 113 +2 / 110 +3 / 85 +4 / 105 +5 / 102 +6 / 86 +7 / 63 +8 / 81 +9 / 101 +10 / 94 +11 / 106 +12 / 101 +13 / 79 +14 / 94 +15 / 90 +16 / 97 From dffa0f1c3ac70970843f3afe32a313105e92e417 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Thu, 6 Feb 2020 20:10:50 +0530 Subject: [PATCH 15/18] added comments/documentation --- dsad-2/AS2_PS5_MS_21.py | 53 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/dsad-2/AS2_PS5_MS_21.py b/dsad-2/AS2_PS5_MS_21.py index f876efe..0d95778 100644 --- a/dsad-2/AS2_PS5_MS_21.py +++ b/dsad-2/AS2_PS5_MS_21.py @@ -4,6 +4,16 @@ def _max_subarray_lr(lst, low, mid, high): + """ find the subarray with maximum sum. + + :param lst: list of items containing profits. + :param low: current low index + :param mid: current high index + :param high: current mid index + :return: sum of left+right, left and right subarray index. + """ + + # sum of left subarray. left_total = 0 max_left = max_right = 0 current_total = 0 @@ -13,6 +23,7 @@ def _max_subarray_lr(lst, low, mid, high): left_total = current_total max_left = i + # sum of right subarray. right_total = 0 current_total = 0 for i in range(mid+1, high+1, 1): @@ -21,18 +32,31 @@ def _max_subarray_lr(lst, low, mid, high): right_total = current_total max_right = i - return left_total+right_total, max_left, max_right + return left_total + right_total, max_left, max_right def maxProfit_divide_conquer(lst, low, high): + """ Find the maximum profit in a profits array using divide and conquer method. + + :param lst: list of items containing profits. + :param low: current low index + :param high: current high index + :return: maximum profit, profit start index, profit end index + """ + if low == high: return lst[low].get('profit'), low, high else: mid = (low + high) // 2 + + # recursively divide profits array into left/right halves, and return + # max(left, right, left_right) profit value. left_total, left_low, left_high = maxProfit_divide_conquer(lst, low, mid) right_total, right_low, right_high = maxProfit_divide_conquer(lst, mid+1, high) lr_total, lr_low, lr_high = _max_subarray_lr(lst, low, mid, high) + # return max(left_total, right_total, left_right_total) along with + # it's respective start/end position in the profits array. if left_total >= right_total and left_total >= lr_total: return left_total, left_low, left_high elif right_total >= left_total and right_total >= lr_total: @@ -42,6 +66,12 @@ def maxProfit_divide_conquer(lst, low, high): def maxProfit_iterative(lst): + """ find maximum profit along with buy/sell day in a stock price list, + using iterative method. + + :param lst: list of items containing day/stock-price values. + :return: maximum profit, buy day, sell day + """ profit = 0 buy_day = min_day = 0 sell_day = 1 @@ -57,15 +87,30 @@ def maxProfit_iterative(lst): return profit, buy_day, sell_day - def main(): + """ read input file, compute max-profit using iterative and divide/conquer methods + and write the profit, buy-day, sell-day to output file. + + :return: + """ infile = 'inputPS5.txt' lst = list() + # read input file and create a list like the following: + # ( + # { 'day': 0, 'price': 10, 'profit': 0 }, + # { 'day': 1, 'price': 20, 'profit': 10 }, + # { 'day': 2, 'price': 15, 'profit': -5}, + # { 'day': 3, 'price': 30, 'profit': 15}, + # ... + # ) with open(infile, "r") as f: for line in f: - if re.match('[0-9]+ */ *[0-9]+', line): + # process only lines containing the pattern: + # [optional spaces]/[optional spaces] + if re.match('^[0-9]+ */ *[0-9]+$', line): + # split by '/' with 0 or more spaces on either sides. (day, price) = re.split(r' */ *', line.rstrip()) day = int(day) price = int(price) @@ -74,7 +119,6 @@ def main(): for i in range(1, len(lst)): lst[i]['profit'] = lst[i].get('price') - lst[i-1].get('price') - outfile = 'outputPS5.txt' with open(outfile, 'w+') as f: @@ -83,7 +127,6 @@ def main(): f.write("ERROR: Too few entries.\n") return - # find maximum subarray for divide and conquer approach. # buy_day will be 1 day before the first profit day. (profit_by_dc, profit_start_day, profit_end_day) = maxProfit_divide_conquer(lst, 0, len(lst)-1) From 90509a57eeafac479867611f90f08edd9ed0f794 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 16 Feb 2020 20:51:24 +0530 Subject: [PATCH 16/18] added analysis file and final deliverable. also matching outputPS5.txt to the inputPS5.txt --- dsad-2/ASSIGNMENT2_PUN_G21.zip | Bin 0 -> 23767 bytes dsad-2/designPS5_21.docx | Bin 0 -> 24490 bytes dsad-2/outputPS5.txt | 7 ++++++- 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 dsad-2/ASSIGNMENT2_PUN_G21.zip create mode 100644 dsad-2/designPS5_21.docx diff --git a/dsad-2/ASSIGNMENT2_PUN_G21.zip b/dsad-2/ASSIGNMENT2_PUN_G21.zip new file mode 100644 index 0000000000000000000000000000000000000000..ec84a75d91c61d74ee81792298a5cc7fe9bcf0ff GIT binary patch literal 23767 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 literal 0 HcmV?d00001 diff --git a/dsad-2/designPS5_21.docx b/dsad-2/designPS5_21.docx new file mode 100644 index 0000000000000000000000000000000000000000..388fa01208b0445250009238a9b570e58d94124e GIT binary patch literal 24490 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 r{lDSgp0Q8!r-##@JTdrh{T9E`_}&eMSq6H literal 0 HcmV?d00001 diff --git a/dsad-2/outputPS5.txt b/dsad-2/outputPS5.txt index 198778c..488c24f 100644 --- a/dsad-2/outputPS5.txt +++ b/dsad-2/outputPS5.txt @@ -1 +1,6 @@ -ERROR: Too few entries. +Maximum Profit(Divide & Conquer): 43 +Day to buy: 7 +Day to sell: 11 +Maximum Profit(Iterative Solution): 43 +Day to buy: 7 +Day to sell: 11 From cb28727407664ea42ed84d0710dea00fdb7c090d Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 16 Feb 2020 21:30:17 +0530 Subject: [PATCH 17/18] corrected somewhat ambiguous explanation --- dsad-2/designPS5_21.docx | Bin 24490 -> 30701 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dsad-2/designPS5_21.docx b/dsad-2/designPS5_21.docx index 388fa01208b0445250009238a9b570e58d94124e..9d5fa20e99173842d3d294ed7baf0c4115363df5 100644 GIT binary patch delta 21546 zcmY(qWmH{F(*+0wmjDUw1a}GU7Tnz>xVy{2U4naXcXxMpcL?t8F!y=CS+mys>~;I} z*{aNV;R*YiH)2coP;--x~kTUy4a!wrAeQ&zu(ZRe5PGP(Fop7=+;B;)qXa*rBWt@Lq8_9>WMV+>iuN~kg)J9}@z0G0} z3s`aDdvASmXYBCee}8di!RqWvot)ex0TX;#TCn26nmpX`F64h+%*vXN!S%9zsISxb zBwxoP6yHRqf2kX|dfoV`e;P9Vc+=tbL^Qu62<#xBdOcCDzbKq}(=G(S#L6PW7kFHe zuAWQa@%fui9jTgIF$PdSGBUfm&Za(EJ71`H zo=Us0GNT9c24b$HyOUy$W5@w#N`>ar2e{;?^84>kuVcq6c9By_a;YB<4!r4J#h0JQ zz{7|79rD8a{nSmgM*L-!O${q&J_Epy8~p`iZshH^lk-|HLmMAmM!P!SzcnSo>vM

Gu7@O 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 Fe*jJDYW)BJ From eeef0500a2bcdf248c7f6371336b4b803fe87523 Mon Sep 17 00:00:00 2001 From: jitender_singh Date: Sun, 16 Feb 2020 21:30:43 +0530 Subject: [PATCH 18/18] corrected somewhat ambiguous explanation --- dsad-2/ASSIGNMENT2_PUN_G21.zip | Bin 23767 -> 30152 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dsad-2/ASSIGNMENT2_PUN_G21.zip b/dsad-2/ASSIGNMENT2_PUN_G21.zip index ec84a75d91c61d74ee81792298a5cc7fe9bcf0ff..b92d04f747ca8611ec2482adb937f39ef32cdac7 100644 GIT binary patch delta 28147 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�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 delta 21712 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ℑHY$rN162`fmV({F?(t|BC+Cowxr6T*m)lAMRgC{B_^bzk!J3 zZ+0>L75%S^`u_%D-oIbs|0{+6UcLTL$old^|JPdfU(x@2Rq?+V5cm)Df37k975lHt zFaHJ&;s0wf=C8 r{|~cZbO!+r{H0J(sTN)CrBeU^s$Y|Jbt(cRU6Y}8AqH<-00000Xw@*#