Algorithmic Toolbox | Week 4
Course Name: Algorithmic Toolbox
Course Link: Algorithmic Toolbox
These are Algorithmic Toolbox Week 4 Programming Assignment Coursera Answers
Programming Assignment 4: Divide and Conquer
4-1: Binary Search
def binary_search(keys, query):
left = 0
right = len(keys) - 1
while right >= left:
middle = (left + right) // 2
if keys[middle] == query:
return middle
elif keys[middle] < query:
left = middle + 1
else:
right = middle - 1
return -1
if __name__ == '__main__':
num_keys = int(input())
input_keys = list(map(int, input().split()))
assert len(input_keys) == num_keys
num_queries = int(input())
input_queries = list(map(int, input().split()))
assert len(input_queries) == num_queries
results = []
for q in input_queries:
results.append(binary_search(input_keys, q))
print(' '.join(map(str, results)))
These are Algorithmic Toolbox Week 4 Programming Assignment Coursera Answers
4-2: Binary Search with Duplicates
def binary_search_first_occurrence(keys, query): left = 0 right = len(keys) - 1 result = -1 while right >= left: middle = (left + right) // 2 if keys[middle] == query: result = middle right = middle - 1 # Continue to search in the left half elif keys[middle] < query: left = middle + 1 else: right = middle - 1 return result if __name__ == '__main__': num_keys = int(input()) input_keys = list(map(int, input().split())) assert len(input_keys) == num_keys num_queries = int(input()) input_queries = list(map(int, input().split())) assert len(input_queries) == num_queries results = [] for q in input_queries: results.append(binary_search_first_occurrence(input_keys, q)) print(' '.join(map(str, results)))
These are Algorithmic Toolbox Week 4 Programming Assignment Coursera Answers
4-3: Majority Element
n = int(input()) seq = [int(i) for i in input().split()] def divide_func(seq, l, r): if l+1==r: return seq[l] elif l+2==r: return seq[l] m = (l+r)//2 left = divide_func(seq, l, m) right = divide_func(seq, m, r) c1, c2 = 0, 0 for i in seq[l:r]: if i == left: c1+=1 elif i == right: c2+=1 if c1>(r-l)//2 and left != -1: return left elif c2>(r-l)//2 and right != -1: return right else: return -1 print(int(divide_func(seq, 0, n) != -1))
These are Algorithmic Toolbox Week 4 Programming Assignment Coursera Answers
4-4: Improving QuickSort
from random import randint def partition3(array, left, right): pivot = array[left] lt = left gt = right i = left while i <= gt: if array[i] < pivot: array[lt], array[i] = array[i], array[lt] lt += 1 i += 1 elif array[i] > pivot: array[gt], array[i] = array[i], array[gt] gt -= 1 else: i += 1 return lt, gt def randomized_quick_sort(array, left, right): if left >= right: return k = randint(left, right) array[left], array[k] = array[k], array[left] m1, m2 = partition3(array, left, right) randomized_quick_sort(array, left, m1 - 1) randomized_quick_sort(array, m2 + 1, right) if __name__ == '__main__': input_n = int(input()) elements = list(map(int, input().split())) assert len(elements) == input_n randomized_quick_sort(elements, 0, len(elements) - 1) print(*elements)
These are Algorithmic Toolbox Week 4 Programming Assignment Coursera Answers
4-5: Inversions
def merge(left, right): i, j, inversion_counter = 0, 0, 0 final = list() while i < len(left) and j< len(right): if left[i] <= right[j]: final.append(left[i]) i += 1 else: final.append(right[j]) inversion_counter += len(left) - i j += 1 final += left[i:] final += right[j:] return final, inversion_counter def mergesort(arr): global tot_count if len(arr) <= 1: return arr mid = len(arr)//2 left = mergesort(arr[:mid]) right = mergesort(arr[mid:]) sorted_arr, temp = merge(left, right) tot_count += temp return sorted_arr tot_count = 0 n = int(input()) seq = [int(i) for i in input().split()] mergesort(seq) print(tot_count)
These are Algorithmic Toolbox Week 4 Programming Assignment Coursera Answers
4-6: Organizing a Lottery
master_list = list() s, p = [int(i) for i in input().split()] for i in range(s): a, b = [int(i) for i in input().split()] master_list.append((a,'l')) master_list.append((b,'r')) points = input().split() for i in points: master_list.append((int(i),'p')) master_list.sort() segment_count = 0 point_segment_map = dict() for i in master_list: if i[1] == 'l': segment_count += 1 elif i[1] == 'r': segment_count -= 1 else: point_segment_map[i[0]] = segment_count temp = '' for i in points: temp += str(point_segment_map[int(i)]) + ' ' print(temp[:-1])
These are Algorithmic Toolbox Week 4 Programming Assignment Coursera Answers
4-7:Closest Points
import math def dist(p1, p2): return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) def closest_split_pair(p_x, p_y, delta, best_pair): ln_x = len(p_x) mx_x = p_x[ln_x // 2][0] s_y = [x for x in p_y if mx_x - delta <= x[0] <= mx_x + delta] best = delta ln_y = len(s_y) for i in range(ln_y - 1): for j in range(i+1, min(i + 5, ln_y)): p, q = s_y[i], s_y[j] dst = dist(p, q) if dst < best: best_pair = p, q best = dst return best_pair[0], best_pair[1], best def brute(ax): mi = dist(ax[0], ax[1]) p1 = ax[0] p2 = ax[1] ln_ax = len(ax) if ln_ax == 2: return p1, p2, mi for i in range(ln_ax-1): for j in range(i + 1, ln_ax): if i != 0 and j != 1: d = dist(ax[i], ax[j]) if d < mi: mi = d p1, p2 = ax[i], ax[j] return p1, p2, mi def closest_pair(ax, ay): ln_ax = len(ax) if ln_ax <= 3: return brute(ax) mid = ln_ax // 2 Qx = ax[:mid] Rx = ax[mid:] midpoint = ax[mid][0] Qy = list() Ry = list() for x in ay: if x[0] < midpoint: Qy.append(x) else: Ry.append(x) (p1, q1, mi1) = closest_pair(Qx, Qy) (p2, q2, mi2) = closest_pair(Rx, Ry) if mi1 <= mi2: d = mi1 mn = (p1, q1) else: d = mi2 mn = (p2, q2) (p3, q3, mi3) = closest_split_pair(ax, ay, d, mn) if d <= mi3: return mn[0], mn[1], d else: return p3, q3, mi3 def solution(a): ax = sorted(a, key=lambda x: x[0]) ay = sorted(a, key=lambda x: (x[1], x[0])) p1, p2, mi = closest_pair(ax, ay) return mi points = list() n = int(input()) for i in range(n): points.append([int(i) for i in input().split()]) print(solution(points))
These are Algorithmic Toolbox Week 4 Programming Assignment Coursera Answers
More Weeks of the course: Click Here
More Coursera courses: https://progiez.com/coursera