def binary_search(list, target):
"""
二分查找算法
"""
low = 0
high = len(list) - 1
while low <= high:
mid = (low + high) // 2
if list[mid] == target:
return mid
elif list[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
在上面的代码中,list 表示要进行查找的有序列表,target 表示查找的目标值。
在算法开始时,我们首先设置 low=0 和 high=len(list)-1。这表示我们要查找整个列表。然后我们在 while 循环中不断缩小查找范围,直到找到目标值或者无法再缩小范围。
在每一次循环中,我们首先计算出中间值 mid,并将其与目标值进行比较。如果相等,那么我们就直接返回中间值 mid。如果中间值小于目标值,那么说明目标值应该在中间值的右侧,因此我们将 low 设置为 mid + 1。如果中间值大于目标值,那么说明目标值应该在中间值的左侧,因此我们将 high 设置为 mid - 1。当 low 大于 high 时,表示查找失败,此时我们直接返回 -1。
下面我们可以调用上面的函数来查找数字 5 是否在有序列表 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 中:
print(binary_search([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5))
运行上面的代码后,我们将得到输出结果 4。这表示数字 5 在列表中的索引位置为 4。
def is_palindrome(s):
"""
判断一个字符串是否是回文串
"""
s = s.lower() # 转换为小写字母
s = ''.join(e for e in s if e.isalnum()) # 去掉空格和非字母数字字符
return s == s[::-1] # 判断反转后的字符串是否与原来相等
在这个函数中,我们将输入字符串 s 转换为小写字母,然后使用字符串的切片操作 [::-1] 获得字符串的反转形式。最后,我们将反转后的字符串与原来的字符串进行比较,如果相等,则返回 True,否则返回 False。
下面我们可以调用上面的函数来判断一个字符串是否是回文串:
print(is_palindrome("A man, a plan, a canal: Panama"))
输出结果为 True,因为输入的字符串 “A man, a plan, a canal: Panama” 是一个回文串。
这个函数的实现过程中,我们使用了 Python 的字符串函数 lower() 将输入字符串转换为小写字母形式。另外,我们还使用了字符串的 isalnum() 方法,该方法用于检查字符串是否只包含字母和数字。使用列表推导式去除除字母数字以外的字符。
LRU Cache(Least Recently Used Cache)算法是一种常见的缓存淘汰策略。它的基本思想是:如果一个数据在最近一段时间内没有被访问到,那么在将来其被访问的概率也很小,因此可以被选择删除。
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.cache = OrderedDict()
def get(self, key: int) -> int:
if key not in self.cache:
return -1
self.cache.move_to_end(key)
return self.cache[key]
def put(self, key: int, value: int) -> None:
if key in self.cache:
del self.cache[key]
self.cache[key] = value
self.cache.move_to_end(key)
if len(self.cache) > self.capacity:
self.cache.popitem(last=False)
在上面的代码中,我们使用了 Python 的 collections 模块中的 OrderedDict 类来实现 LRU Cache 算法。这个类的实例就像一个普通的字典,但是它可以记录插入键值对的顺序。这使得我们可以访问最近插入的条目。
在 __init__ 方法中,我们将实例变量 capacity 设置为传递进来的参数。这个变量表示缓存的最大容量。然后我们创建一个空的 OrderedDict 来存储缓存条目。
在 get 方法中,我们首先判断缓存中是否存在与输入 key 相对应的条目。如果不存在,那么我们直接返回 -1。否则,我们将输入 key 对应的条目移到字典的顶部,并返回该条目对应的值。
在 put 方法中,我们首先判断缓存中是否已经存在输入 key 对应的条目。如果存在,我们即可覆盖该条目的值,并将它移动到字典的顶部。如果不存在,我们需要在字典的顶部插入新的条目,并且判断字典的容量是否超过了 capacity,如果超过了,我们就删除字典底部的最近未使用条目。
下面我们可以创建一个最大容量为 3 的 LRU Cache 对象,并通过调用 put 和 get 方法来测试它的功能:
cache = LRUCache(3)
cache.put(1, 1)
print(cache.cache)
cache.put(2, 2)
print(cache.cache)
cache.put(3, 3)
print(cache.cache)
cache.get(1)
print(cache.cache)
cache.put(4, 4)
print(cache.cache)
cache.get(2)
print(cache.cache)
运行上面的代码,我们将得到以下输出:
OrderedDict([(1, 1)])
OrderedDict([(1, 1), (2, 2)])
OrderedDict([(1, 1), (2, 2), (3, 3)])
OrderedDict([(2, 2), (3, 3), (1, 1)])
OrderedDict([(3, 3), (1, 1), (4, 4)])
OrderedDict([(1, 1), (4, 4), (3, 3)])
这个例子中,我们创建了一个最大容量为 3 的 LRU Cache 对象,并依次向它插入了键值对 (1, 1)、(2, 2)、(3, 3)。然后,我们调用了 get 方法来获取键为 1 和 2 的条目。最后,我们插入了一个额外的键值对 (4, 4)。在插入第 4 个条目时,由于 LRU Cache 的容量已达到最大值,因此先删除了最近最少使用的键值对 (2, 2)。
页面更新:2024-03-02
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号