分类目录归档:算法

位运算


原码反码补码

  • 补码(twos complement) 在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
  • 正数的原码补码反码相同
  • 负数的反码是对其原码逐位取反(符号位除外)
  • 负数的补码是对其原码逐位取反(符号位除外),然后整个数加1

XOR - 异或

异或: 相同为 0,不同为 1。也可用“不进位加法”来理解。 异或操作的一些特点:

  • x ^ 0 =x
  • x ^ 1s = ~x // 注意 1s = ~0
  • x ^ (~x) = 1s (1s

Read more

搜索


搜索

剪枝 双向 BFS 启发式搜索(A*)

初级搜索

  1. 朴素搜索
  2. 优化方式: 不重复(fibnacci)、剪枝(生成括号问题)
  3. 搜索方向:

    DFS: depth first search 深度优先搜索
    BFS: breadth first search 广度优先搜索

    双向搜索、启发式搜索

Read more

动态规划 dynamic programming


定义

https://en.wikipedia.org/wiki/Dynamic_programming
https://zh.wikipedia.org/wiki/动态规划

  • "Simplifying a complicated problem by breaking it down into simpler subproblems"(in a recursive manager)
  • Divide & Conquer + Optimal substructure (分治+最优子结构)

DP 顺推模板

function DP():
dp = [][] # 二维情况
for i = 0 

Read more

二分查找


二分查找

  • 目标函数单调性(单调递增或者递减)
  • 存在上下界(bounded)
  • 能够通过索引访问(index accessible)

代码模版

循环

left, right = 0, len(array) -1
while left <= right:
  mid = (left+right)/2
  if array[mid] == target:
    # find the target
    break or return result
  elif array[mid] < target:
    left = mid + 1 # 左右下界为整型需要加一减一,左右下界如

Read more

贪心算法 Greedy


贪心算法 Greedy

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致 结果是全剧最好或最优的算法
贪心算法与动态规划的不同在于他对每个字问题的解决方案都做出选择,不能回退。动态规划则会 保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能

贪心算法可以解决工程中一些最优化问题, 如: 求图中的最小生成树、求哈夫曼编码等。然而对于 工程和生活中的问题,贪心法一般不能得到我们所要求的答案

一旦一个问题可以通过贪心法来解决。那么贪心法一般是解决这个问题的最好办法。 由于贪心法的搞笑性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者

Read more

Bloom Filter


Bloom Filter

Bloom Filter vs Hash Table

一个很长的二进制向量和一系列随机映射函数。  
布隆过滤器可以用于检索一个元素是否在一个集合中。  
优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

案例

    1. 比特币网络
    1. 分布式系统(Map-Reduce) — Hadoop、search engine
    1. Redis 缓存
    1. 垃圾邮件、评论等的过滤

科普

https://www.cnblogs.com/cpselvis/p/6265825.html https://blog.csdn.net/tianyaleix

Read more

分治 && 回溯


代码模版

def divide_conquer(problem, param1, param2, ...):
  # recursion terminator
  if problem is None:
    print_result
    return

  # prepare data
  data = prepare_data(problem)
  subproblems = split_problem(problem, data)

  # conquer subproblems
  subresult1 = self.divide_conquer(subproblems[0], 

Read more

启发式搜索


A* search

估价函数

启发式函数: h(n),它用来评价哪些结点最有希望的是一个我们要找的结 点,h(n) 会返回一个非负实数,也可以认为是从结点n的目标结点路径的估 计成本。 启发式函数是一种告知搜索方向的方法。它提供了一种明智的方法来猜测 哪个邻居结点会导向一个目标。

相似度测量方法

https://dataaspirant.com/2015/04/11/five-most-popular-similarity-measures-implementation-in-python/

代码模版

def AstartSearch(graph, start, end):
    pq = 

Read more