策略模式
大多数问题都可以使用多种方法来解决。以排序问题为例,对于以一定次序把元素放入一个列表,排序算法有很多。
通常来说,没有工人最适合所有场景的算法。
需要考虑的元素数量
算法最佳、平均、最差时间复杂度
算法的空间复杂度
算法的稳定性
算法的代码实现复杂度
策略模式鼓励用多种算法来解决一个问题,其杀手级特性是能够在运行时透明地切换算法(客户端代码对变化无感知)。
因此,如果你有两种算法,并且知道其中对少量输入效果更好,另一种对大量输入效果更好,
则可以适用策略模式在运行时基于输入数据决定使用哪种算法。
python的sorted()和li.sort()函数是策略模式的例子。
两个函数都接受一个命名参数key,这个参数本质上是实现了一个排序策略的函数的名称
按字母顺序排列
基于TIOBE排序
import pprint # 美化输出 from collections import namedtuple # 通过属性名访问class或namedtuple from operator import attrgetter if __name__ == '__main__': ProgrammingLang = namedtuple('ProgrammingLang', 'name ranking') stats = (('Ruby', 14), ('Javascript', 8), ('Python', 7), ('Scala', 31), ('Swift', 18), ('Lisp', 23)) lang_stats = [ProgrammingLang(n, r) for n, r in stats] pp = pprint.PrettyPrinter(indent=5) pp.pprint(sorted(lang_stats, key=attrgetter('name'))) print() pp.pprint(sorted(lang_stats, key=attrgetter('ranking')))
检测一个字符串中是否所有字符都是唯一的 1、先排序 2、判断是否相邻的相同
import time SLOW = 3 # 单位为秒 LIMIT = 5 # 字符数 WARNING = 'too bad, you picked the slow algorithm :(' def pairs(seq): n = len(seq) for i in range(n): yield seq[i], seq[(i + 1) % n] def allUniqueSort(s): if len(s) > LIMIT: print(WARNING) time.sleep(SLOW) srtStr = sorted(s) for (c1, c2) in pairs(srtStr): if c1 == c2: return False return True def allUniqueSet(s): if len(s) < LIMIT: print(WARNING) time.sleep(SLOW) return True if len(set(s)) == len(s) else False def allUnique(s, strategy): return strategy(s) def main(): while True: word = None while not word: word = input('Insert word (type quit to exit)> ') if word == 'quit': print('bye') return strategy_picked = None strategies = {'1': allUniqueSet, '2': allUniqueSort} while strategy_picked not in strategies.keys(): strategy_picked = input('Choose strategy: [1] Use a set, [2] Sort and pair> ') try: strategy = strategies[strategy_picked] print('allUnique({}): {}'.format(word, allUnique(word, strategy))) except KeyError as err: print('Incorrect option: {}'.format(strategy_picked)) if __name__ == '__main__': main()