How to merge k sorted arrays, solution didn't work allowing duplicates.!
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}
Given k sorted arrays of size n each, merge them and print the sorted output.
The algorithm I followed is
- iterate of over each array
- pick the ith index in k arrays
insert()
in minheap
delMin()
and append result array.
from heapq import heappop, heappush
def merge_k_arrays(list_of_lists):
result = #len(list_of_lists[0])*len(list_of_lists)
minHeap=
n, k=0,0
print(list_of_lists)
while n < len(list_of_lists[0]):
if n ==0:# initial k size heap ready
while k < len(list_of_lists):
element= list_of_lists[k][n]
heappush(minHeap ,element )
k+=1
result.append(heappop(minHeap))
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
result.append(heappop(minHeap))
k+=1
n += 1
# add the left overs in the heap
while minHeap:
result.append(heappop(minHeap))
return result
Input:
input = [ [1, 3, 5, 7],
[2, 4, 6, 8],
[0, 9, 10, 11],
]
Output:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
input:
input = [ [1, 3, 5, 7],
[2, 4, 6, 8],
[3, 3, 3, 3],
[7, 7, 7,7]
]
output:
[0, 1, 2, 3, 3, 3, 4, 5, 6, 3, 7, 7, 7, 7, 3, 7, 8, 9, 10, 11]
Could anyone help me know what piece is missing from my algorithm in order to merge the duplicate arrays in the second input too?
python python-3.x sorting heap heapq
add a comment |
Given k sorted arrays of size n each, merge them and print the sorted output.
The algorithm I followed is
- iterate of over each array
- pick the ith index in k arrays
insert()
in minheap
delMin()
and append result array.
from heapq import heappop, heappush
def merge_k_arrays(list_of_lists):
result = #len(list_of_lists[0])*len(list_of_lists)
minHeap=
n, k=0,0
print(list_of_lists)
while n < len(list_of_lists[0]):
if n ==0:# initial k size heap ready
while k < len(list_of_lists):
element= list_of_lists[k][n]
heappush(minHeap ,element )
k+=1
result.append(heappop(minHeap))
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
result.append(heappop(minHeap))
k+=1
n += 1
# add the left overs in the heap
while minHeap:
result.append(heappop(minHeap))
return result
Input:
input = [ [1, 3, 5, 7],
[2, 4, 6, 8],
[0, 9, 10, 11],
]
Output:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
input:
input = [ [1, 3, 5, 7],
[2, 4, 6, 8],
[3, 3, 3, 3],
[7, 7, 7,7]
]
output:
[0, 1, 2, 3, 3, 3, 4, 5, 6, 3, 7, 7, 7, 7, 3, 7, 8, 9, 10, 11]
Could anyone help me know what piece is missing from my algorithm in order to merge the duplicate arrays in the second input too?
python python-3.x sorting heap heapq
Is there a reason you're doing this instead of just usingheapq.merge
, which already exists and performs this exact functionality? (Technically, it's a generator function, where your function returns alist
, butlist(heapq.merge(*list_of_lists))
would do your job for you)
– ShadowRanger
Nov 23 '18 at 2:45
@ShadowRanger, yes, I am curious to see how this common algorithm works without relying on the libraries.
– anu
Nov 23 '18 at 18:06
Gotcha. Just a heads up,heapq.merge
is actually implemented in Python (no C accelerators), so if you want a reference implementation, it's available. If you useipython
for interactive work (everyone should), simply importingheapq
, then typingheapq.merge??
will display the source code.
– ShadowRanger
Nov 23 '18 at 19:16
add a comment |
Given k sorted arrays of size n each, merge them and print the sorted output.
The algorithm I followed is
- iterate of over each array
- pick the ith index in k arrays
insert()
in minheap
delMin()
and append result array.
from heapq import heappop, heappush
def merge_k_arrays(list_of_lists):
result = #len(list_of_lists[0])*len(list_of_lists)
minHeap=
n, k=0,0
print(list_of_lists)
while n < len(list_of_lists[0]):
if n ==0:# initial k size heap ready
while k < len(list_of_lists):
element= list_of_lists[k][n]
heappush(minHeap ,element )
k+=1
result.append(heappop(minHeap))
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
result.append(heappop(minHeap))
k+=1
n += 1
# add the left overs in the heap
while minHeap:
result.append(heappop(minHeap))
return result
Input:
input = [ [1, 3, 5, 7],
[2, 4, 6, 8],
[0, 9, 10, 11],
]
Output:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
input:
input = [ [1, 3, 5, 7],
[2, 4, 6, 8],
[3, 3, 3, 3],
[7, 7, 7,7]
]
output:
[0, 1, 2, 3, 3, 3, 4, 5, 6, 3, 7, 7, 7, 7, 3, 7, 8, 9, 10, 11]
Could anyone help me know what piece is missing from my algorithm in order to merge the duplicate arrays in the second input too?
python python-3.x sorting heap heapq
Given k sorted arrays of size n each, merge them and print the sorted output.
The algorithm I followed is
- iterate of over each array
- pick the ith index in k arrays
insert()
in minheap
delMin()
and append result array.
from heapq import heappop, heappush
def merge_k_arrays(list_of_lists):
result = #len(list_of_lists[0])*len(list_of_lists)
minHeap=
n, k=0,0
print(list_of_lists)
while n < len(list_of_lists[0]):
if n ==0:# initial k size heap ready
while k < len(list_of_lists):
element= list_of_lists[k][n]
heappush(minHeap ,element )
k+=1
result.append(heappop(minHeap))
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
result.append(heappop(minHeap))
k+=1
n += 1
# add the left overs in the heap
while minHeap:
result.append(heappop(minHeap))
return result
Input:
input = [ [1, 3, 5, 7],
[2, 4, 6, 8],
[0, 9, 10, 11],
]
Output:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
input:
input = [ [1, 3, 5, 7],
[2, 4, 6, 8],
[3, 3, 3, 3],
[7, 7, 7,7]
]
output:
[0, 1, 2, 3, 3, 3, 4, 5, 6, 3, 7, 7, 7, 7, 3, 7, 8, 9, 10, 11]
Could anyone help me know what piece is missing from my algorithm in order to merge the duplicate arrays in the second input too?
python python-3.x sorting heap heapq
python python-3.x sorting heap heapq
edited Nov 23 '18 at 3:02
georgexsh
10.9k11339
10.9k11339
asked Nov 23 '18 at 2:03
anuanu
6161021
6161021
Is there a reason you're doing this instead of just usingheapq.merge
, which already exists and performs this exact functionality? (Technically, it's a generator function, where your function returns alist
, butlist(heapq.merge(*list_of_lists))
would do your job for you)
– ShadowRanger
Nov 23 '18 at 2:45
@ShadowRanger, yes, I am curious to see how this common algorithm works without relying on the libraries.
– anu
Nov 23 '18 at 18:06
Gotcha. Just a heads up,heapq.merge
is actually implemented in Python (no C accelerators), so if you want a reference implementation, it's available. If you useipython
for interactive work (everyone should), simply importingheapq
, then typingheapq.merge??
will display the source code.
– ShadowRanger
Nov 23 '18 at 19:16
add a comment |
Is there a reason you're doing this instead of just usingheapq.merge
, which already exists and performs this exact functionality? (Technically, it's a generator function, where your function returns alist
, butlist(heapq.merge(*list_of_lists))
would do your job for you)
– ShadowRanger
Nov 23 '18 at 2:45
@ShadowRanger, yes, I am curious to see how this common algorithm works without relying on the libraries.
– anu
Nov 23 '18 at 18:06
Gotcha. Just a heads up,heapq.merge
is actually implemented in Python (no C accelerators), so if you want a reference implementation, it's available. If you useipython
for interactive work (everyone should), simply importingheapq
, then typingheapq.merge??
will display the source code.
– ShadowRanger
Nov 23 '18 at 19:16
Is there a reason you're doing this instead of just using
heapq.merge
, which already exists and performs this exact functionality? (Technically, it's a generator function, where your function returns a list
, but list(heapq.merge(*list_of_lists))
would do your job for you)– ShadowRanger
Nov 23 '18 at 2:45
Is there a reason you're doing this instead of just using
heapq.merge
, which already exists and performs this exact functionality? (Technically, it's a generator function, where your function returns a list
, but list(heapq.merge(*list_of_lists))
would do your job for you)– ShadowRanger
Nov 23 '18 at 2:45
@ShadowRanger, yes, I am curious to see how this common algorithm works without relying on the libraries.
– anu
Nov 23 '18 at 18:06
@ShadowRanger, yes, I am curious to see how this common algorithm works without relying on the libraries.
– anu
Nov 23 '18 at 18:06
Gotcha. Just a heads up,
heapq.merge
is actually implemented in Python (no C accelerators), so if you want a reference implementation, it's available. If you use ipython
for interactive work (everyone should), simply importing heapq
, then typing heapq.merge??
will display the source code.– ShadowRanger
Nov 23 '18 at 19:16
Gotcha. Just a heads up,
heapq.merge
is actually implemented in Python (no C accelerators), so if you want a reference implementation, it's available. If you use ipython
for interactive work (everyone should), simply importing heapq
, then typing heapq.merge??
will display the source code.– ShadowRanger
Nov 23 '18 at 19:16
add a comment |
1 Answer
1
active
oldest
votes
To fix your code, move the result.append(heappop(minHeap))
in your second nested while loop to the outside of the nested while loop, like in your first nested while loop. This will make your code work.
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
k+=1
result.append(heappop(minHeap))
n += 1
If you have any space constraints, this is still problematic since you are adding nearly your entire input into the heap. If space is not an issue, there is a much cleaner way to write your solution:
def merge(A):
result =
heap = [e for row in A for e in row]
heapify(heap)
for i in range(len(heap)):
result.append(heappop(heap))
return result
Otherwise, you will need to use a smarter solution that only allows the heap to have k elements in total, with one element from each list, and the new element you add each step should come from the origin list of the element that was just popped.
Thanks for the suggestion, but your algorithm is both time & space inefficient. Theasymptotic analysis of your algorithm
:3rd line will take O(n*k)
,4th line will run in O(n*k)
,6th line will run in O(n*k log n*k)
, so total runtime of your algorithm isn*k log n*k
which is not efficient. On the other hand, in my algo, I am trying to keep theheapsize fixed to k(number of given arrays to merge)
. in first loop, Ibuild this k size heap in O(k log k)
, then Ipop the element which takes O(k log k)
and then adds text from input to heap that takesO(n log n)
& repeat.
– anu
Nov 23 '18 at 20:10
so, my algo. worst case runtime would beO(n log n)
with space onlyO(k)
, but what I am stuck at is my method is failing for duplicate input at the back because restoring heap doesn't sort the already present items which is barrier to allow duplicates. could you suggest a solution to this problem.?
– anu
Nov 23 '18 at 20:14
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439850%2fhow-to-merge-k-sorted-arrays-solution-didnt-work-allowing-duplicates%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
To fix your code, move the result.append(heappop(minHeap))
in your second nested while loop to the outside of the nested while loop, like in your first nested while loop. This will make your code work.
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
k+=1
result.append(heappop(minHeap))
n += 1
If you have any space constraints, this is still problematic since you are adding nearly your entire input into the heap. If space is not an issue, there is a much cleaner way to write your solution:
def merge(A):
result =
heap = [e for row in A for e in row]
heapify(heap)
for i in range(len(heap)):
result.append(heappop(heap))
return result
Otherwise, you will need to use a smarter solution that only allows the heap to have k elements in total, with one element from each list, and the new element you add each step should come from the origin list of the element that was just popped.
Thanks for the suggestion, but your algorithm is both time & space inefficient. Theasymptotic analysis of your algorithm
:3rd line will take O(n*k)
,4th line will run in O(n*k)
,6th line will run in O(n*k log n*k)
, so total runtime of your algorithm isn*k log n*k
which is not efficient. On the other hand, in my algo, I am trying to keep theheapsize fixed to k(number of given arrays to merge)
. in first loop, Ibuild this k size heap in O(k log k)
, then Ipop the element which takes O(k log k)
and then adds text from input to heap that takesO(n log n)
& repeat.
– anu
Nov 23 '18 at 20:10
so, my algo. worst case runtime would beO(n log n)
with space onlyO(k)
, but what I am stuck at is my method is failing for duplicate input at the back because restoring heap doesn't sort the already present items which is barrier to allow duplicates. could you suggest a solution to this problem.?
– anu
Nov 23 '18 at 20:14
add a comment |
To fix your code, move the result.append(heappop(minHeap))
in your second nested while loop to the outside of the nested while loop, like in your first nested while loop. This will make your code work.
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
k+=1
result.append(heappop(minHeap))
n += 1
If you have any space constraints, this is still problematic since you are adding nearly your entire input into the heap. If space is not an issue, there is a much cleaner way to write your solution:
def merge(A):
result =
heap = [e for row in A for e in row]
heapify(heap)
for i in range(len(heap)):
result.append(heappop(heap))
return result
Otherwise, you will need to use a smarter solution that only allows the heap to have k elements in total, with one element from each list, and the new element you add each step should come from the origin list of the element that was just popped.
Thanks for the suggestion, but your algorithm is both time & space inefficient. Theasymptotic analysis of your algorithm
:3rd line will take O(n*k)
,4th line will run in O(n*k)
,6th line will run in O(n*k log n*k)
, so total runtime of your algorithm isn*k log n*k
which is not efficient. On the other hand, in my algo, I am trying to keep theheapsize fixed to k(number of given arrays to merge)
. in first loop, Ibuild this k size heap in O(k log k)
, then Ipop the element which takes O(k log k)
and then adds text from input to heap that takesO(n log n)
& repeat.
– anu
Nov 23 '18 at 20:10
so, my algo. worst case runtime would beO(n log n)
with space onlyO(k)
, but what I am stuck at is my method is failing for duplicate input at the back because restoring heap doesn't sort the already present items which is barrier to allow duplicates. could you suggest a solution to this problem.?
– anu
Nov 23 '18 at 20:14
add a comment |
To fix your code, move the result.append(heappop(minHeap))
in your second nested while loop to the outside of the nested while loop, like in your first nested while loop. This will make your code work.
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
k+=1
result.append(heappop(minHeap))
n += 1
If you have any space constraints, this is still problematic since you are adding nearly your entire input into the heap. If space is not an issue, there is a much cleaner way to write your solution:
def merge(A):
result =
heap = [e for row in A for e in row]
heapify(heap)
for i in range(len(heap)):
result.append(heappop(heap))
return result
Otherwise, you will need to use a smarter solution that only allows the heap to have k elements in total, with one element from each list, and the new element you add each step should come from the origin list of the element that was just popped.
To fix your code, move the result.append(heappop(minHeap))
in your second nested while loop to the outside of the nested while loop, like in your first nested while loop. This will make your code work.
else: # one at a time.
k =0
while k < len(list_of_lists):
element = list_of_lists[k][n]
heappush(minHeap , element)
k+=1
result.append(heappop(minHeap))
n += 1
If you have any space constraints, this is still problematic since you are adding nearly your entire input into the heap. If space is not an issue, there is a much cleaner way to write your solution:
def merge(A):
result =
heap = [e for row in A for e in row]
heapify(heap)
for i in range(len(heap)):
result.append(heappop(heap))
return result
Otherwise, you will need to use a smarter solution that only allows the heap to have k elements in total, with one element from each list, and the new element you add each step should come from the origin list of the element that was just popped.
answered Nov 23 '18 at 2:41
samuelli97samuelli97
246
246
Thanks for the suggestion, but your algorithm is both time & space inefficient. Theasymptotic analysis of your algorithm
:3rd line will take O(n*k)
,4th line will run in O(n*k)
,6th line will run in O(n*k log n*k)
, so total runtime of your algorithm isn*k log n*k
which is not efficient. On the other hand, in my algo, I am trying to keep theheapsize fixed to k(number of given arrays to merge)
. in first loop, Ibuild this k size heap in O(k log k)
, then Ipop the element which takes O(k log k)
and then adds text from input to heap that takesO(n log n)
& repeat.
– anu
Nov 23 '18 at 20:10
so, my algo. worst case runtime would beO(n log n)
with space onlyO(k)
, but what I am stuck at is my method is failing for duplicate input at the back because restoring heap doesn't sort the already present items which is barrier to allow duplicates. could you suggest a solution to this problem.?
– anu
Nov 23 '18 at 20:14
add a comment |
Thanks for the suggestion, but your algorithm is both time & space inefficient. Theasymptotic analysis of your algorithm
:3rd line will take O(n*k)
,4th line will run in O(n*k)
,6th line will run in O(n*k log n*k)
, so total runtime of your algorithm isn*k log n*k
which is not efficient. On the other hand, in my algo, I am trying to keep theheapsize fixed to k(number of given arrays to merge)
. in first loop, Ibuild this k size heap in O(k log k)
, then Ipop the element which takes O(k log k)
and then adds text from input to heap that takesO(n log n)
& repeat.
– anu
Nov 23 '18 at 20:10
so, my algo. worst case runtime would beO(n log n)
with space onlyO(k)
, but what I am stuck at is my method is failing for duplicate input at the back because restoring heap doesn't sort the already present items which is barrier to allow duplicates. could you suggest a solution to this problem.?
– anu
Nov 23 '18 at 20:14
Thanks for the suggestion, but your algorithm is both time & space inefficient. The
asymptotic analysis of your algorithm
: 3rd line will take O(n*k)
, 4th line will run in O(n*k)
, 6th line will run in O(n*k log n*k)
, so total runtime of your algorithm is n*k log n*k
which is not efficient. On the other hand, in my algo, I am trying to keep the heapsize fixed to k(number of given arrays to merge)
. in first loop, I build this k size heap in O(k log k)
, then I pop the element which takes O(k log k)
and then adds text from input to heap that takes O(n log n)
& repeat.– anu
Nov 23 '18 at 20:10
Thanks for the suggestion, but your algorithm is both time & space inefficient. The
asymptotic analysis of your algorithm
: 3rd line will take O(n*k)
, 4th line will run in O(n*k)
, 6th line will run in O(n*k log n*k)
, so total runtime of your algorithm is n*k log n*k
which is not efficient. On the other hand, in my algo, I am trying to keep the heapsize fixed to k(number of given arrays to merge)
. in first loop, I build this k size heap in O(k log k)
, then I pop the element which takes O(k log k)
and then adds text from input to heap that takes O(n log n)
& repeat.– anu
Nov 23 '18 at 20:10
so, my algo. worst case runtime would be
O(n log n)
with space only O(k)
, but what I am stuck at is my method is failing for duplicate input at the back because restoring heap doesn't sort the already present items which is barrier to allow duplicates. could you suggest a solution to this problem.?– anu
Nov 23 '18 at 20:14
so, my algo. worst case runtime would be
O(n log n)
with space only O(k)
, but what I am stuck at is my method is failing for duplicate input at the back because restoring heap doesn't sort the already present items which is barrier to allow duplicates. could you suggest a solution to this problem.?– anu
Nov 23 '18 at 20:14
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53439850%2fhow-to-merge-k-sorted-arrays-solution-didnt-work-allowing-duplicates%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Is there a reason you're doing this instead of just using
heapq.merge
, which already exists and performs this exact functionality? (Technically, it's a generator function, where your function returns alist
, butlist(heapq.merge(*list_of_lists))
would do your job for you)– ShadowRanger
Nov 23 '18 at 2:45
@ShadowRanger, yes, I am curious to see how this common algorithm works without relying on the libraries.
– anu
Nov 23 '18 at 18:06
Gotcha. Just a heads up,
heapq.merge
is actually implemented in Python (no C accelerators), so if you want a reference implementation, it's available. If you useipython
for interactive work (everyone should), simply importingheapq
, then typingheapq.merge??
will display the source code.– ShadowRanger
Nov 23 '18 at 19:16