Last active
November 18, 2017 18:18
-
-
Save senarukana/2f399861fe419201279e to your computer and use it in GitHub Desktop.
dot product sparse vector
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# m + n | |
# element expressed as (pos, value) | |
def multiply1(vec1, vec2): | |
i = 0 | |
j = 0 | |
vec = [] | |
while i < len(vec1) and j < len(vec2): | |
if vec1[i][0] > vec2[j][0]: | |
j += 1 | |
elif vec1[i][0] < vec2[j][0]: | |
i += 1 | |
else: | |
vec.append((vec1[i][0], vec1[i][1]*vec2[i][1])) | |
return vec | |
def binary_search(vec, i): | |
left = 0 | |
right = len(vec)-1 | |
while left < right: | |
mid = (left+right)>>1 | |
if vec[mid][0] < i: | |
left = mid+1 | |
elif vec[mid][0] > i: | |
right = mid-1 | |
else: | |
return mid | |
return left | |
# m * lgn | |
# binary search | |
# when m is much smaller than n | |
def multiply2(vec1, vec2): | |
vec = [] | |
k = 0 | |
for element in vec1: | |
i, val = element[0], element[1] | |
j = binary_search(vec2[k:], i) | |
if j == len(vec2): | |
break | |
if i == vec2[j][0]: | |
vec.append(val*vec2[j][1]) | |
k = j+1 | |
return vec | |
# divide and conquer | |
# T(m) = 2T(m/2) + O(logn) | |
# worst case m * lgn | |
# best case ? | |
def multiply3(vec1, vec2): | |
if not vec1 or not vec2: | |
return [] | |
m, n = len(vec1), len(vec2) | |
i = m / 2 | |
j = binary_search(vec2, vec1[i][0]) | |
element = None | |
if j != n and vec1[i][0] == vec2[j][0]: | |
element = (vec1[i][0], vec1[i][1]*vec2[j][1]) | |
return multiply3(vec1[:i], vec2[:j]) + [element] + multiply3(vec1[i+1:], vec2[j+1:]) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment