upd
This commit is contained in:
60
algorithms/labs/lab8/code/hash/1.py
Normal file
60
algorithms/labs/lab8/code/hash/1.py
Normal file
@@ -0,0 +1,60 @@
|
||||
class Node:
|
||||
def __init__(self, key, val):
|
||||
self.key = key
|
||||
self.val = val
|
||||
self.prev = None
|
||||
self.next = None
|
||||
|
||||
|
||||
class LRUCache:
|
||||
def __init__(self, capacity: int):
|
||||
self.cap = capacity
|
||||
self.cache = {}
|
||||
self.left = Node(0, 0)
|
||||
self.right = Node(0, 0)
|
||||
self.left.next = self.right
|
||||
self.right.prev = self.left
|
||||
|
||||
def remove(self, node):
|
||||
p, n = node.prev, node.next
|
||||
p.next = n
|
||||
n.prev = p
|
||||
|
||||
def insert(self, node):
|
||||
p, n = self.right.prev, self.right
|
||||
p.next = node
|
||||
node.prev = p
|
||||
node.next = n
|
||||
n.prev = node
|
||||
|
||||
def get(self, key: int) -> int:
|
||||
if key not in self.cache:
|
||||
return -1
|
||||
node = self.cache[key]
|
||||
self.remove(node)
|
||||
self.insert(node)
|
||||
return node.val
|
||||
|
||||
def put(self, key: int, value: int) -> None:
|
||||
if key in self.cache:
|
||||
self.remove(self.cache[key])
|
||||
node = Node(key, value)
|
||||
self.cache[key] = node
|
||||
self.insert(node)
|
||||
if len(self.cache) > self.cap:
|
||||
lru = self.left.next
|
||||
self.remove(lru)
|
||||
del self.cache[lru.key]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
lru = LRUCache(2)
|
||||
lru.put(1, 1)
|
||||
lru.put(2, 2)
|
||||
print(lru.get(1))
|
||||
lru.put(3, 3)
|
||||
print(lru.get(2))
|
||||
lru.put(4, 4)
|
||||
print(lru.get(1))
|
||||
print(lru.get(3))
|
||||
print(lru.get(4))
|
||||
43
algorithms/labs/lab8/code/hash/2.py
Normal file
43
algorithms/labs/lab8/code/hash/2.py
Normal file
@@ -0,0 +1,43 @@
|
||||
class TrieNode:
|
||||
def __init__(self):
|
||||
self.children = {}
|
||||
self.is_end = False
|
||||
|
||||
|
||||
class Trie:
|
||||
def __init__(self):
|
||||
self.root = TrieNode()
|
||||
|
||||
def insert(self, word):
|
||||
node = self.root
|
||||
for ch in word:
|
||||
if ch not in node.children:
|
||||
node.children[ch] = TrieNode()
|
||||
node = node.children[ch]
|
||||
node.is_end = True
|
||||
|
||||
def search(self, word):
|
||||
node = self.root
|
||||
for ch in word:
|
||||
if ch not in node.children:
|
||||
return False
|
||||
node = node.children[ch]
|
||||
return node.is_end
|
||||
|
||||
def startsWith(self, prefix):
|
||||
node = self.root
|
||||
for ch in prefix:
|
||||
if ch not in node.children:
|
||||
return False
|
||||
node = node.children[ch]
|
||||
return True
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
t = Trie()
|
||||
t.insert("apple")
|
||||
print(t.search("apple"))
|
||||
print(t.search("app"))
|
||||
print(t.startsWith("app"))
|
||||
t.insert("app")
|
||||
print(t.search("app"))
|
||||
50
algorithms/labs/lab8/code/hash/3.py
Normal file
50
algorithms/labs/lab8/code/hash/3.py
Normal file
@@ -0,0 +1,50 @@
|
||||
import heapq
|
||||
|
||||
|
||||
class Twitter:
|
||||
def __init__(self):
|
||||
self.time = 0
|
||||
self.tweets = {}
|
||||
self.follows = {}
|
||||
|
||||
def postTweet(self, userId, tweetId):
|
||||
self.time += 1
|
||||
if userId not in self.tweets:
|
||||
self.tweets[userId] = []
|
||||
self.tweets[userId].append((-self.time, tweetId))
|
||||
|
||||
def getNewsFeed(self, userId):
|
||||
heap = []
|
||||
if userId in self.tweets:
|
||||
heap.extend(self.tweets[userId][-10:])
|
||||
if userId in self.follows:
|
||||
for v in self.follows[userId]:
|
||||
if v in self.tweets:
|
||||
heap.extend(self.tweets[v][-10:])
|
||||
heapq.heapify(heap)
|
||||
res = []
|
||||
while heap and len(res) < 10:
|
||||
res.append(heapq.heappop(heap)[1])
|
||||
return res
|
||||
|
||||
def follow(self, followerId, followeeId):
|
||||
if followerId == followeeId:
|
||||
return
|
||||
if followerId not in self.follows:
|
||||
self.follows[followerId] = set()
|
||||
self.follows[followerId].add(followeeId)
|
||||
|
||||
def unfollow(self, followerId, followeeId):
|
||||
if followerId in self.follows and followeeId in self.follows[followerId]:
|
||||
self.follows[followerId].remove(followeeId)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
tw = Twitter()
|
||||
tw.postTweet(1, 5)
|
||||
print(tw.getNewsFeed(1))
|
||||
tw.follow(1, 2)
|
||||
tw.postTweet(2, 6)
|
||||
print(tw.getNewsFeed(1))
|
||||
tw.unfollow(1, 2)
|
||||
print(tw.getNewsFeed(1))
|
||||
Reference in New Issue
Block a user