摘要:基本思路: 对于某一个物体或人(将被预测或者推荐商品),找到K个和它相近的对应物。 然后从这K个对应物中,取平均 常用算法:KNN
阅读全文
摘要:每两个做输入,先在输入中比大小; 较小者去比较最小记录,较大者去比较最大记录; 建堆; 取K次最大 要求取最大/最小; 可增加、删除元素; 取最大/最小 O(logN) 增加/删除 O(logN) 冲突解决方法: 线性探测法,开链法(申请、释放内存,效率低); 当填充因子较大,需要再哈希 某个; 找
阅读全文
摘要:适用: 要求在某约束条件下,求得由n个元素组成的全部解或最优解(解是个集合) 注意是:它同回溯法解决问题类似,关键的不是在于,这个算法解决的问题,解集合中的元素先后顺序是有影响的; 步骤: 1、把解集合的所有可选元素,整理为树状或图状结构 2、由于解集合元素的先后顺序有关。所以,如果,第m个元素选择
阅读全文
摘要:适用情景: 要求在满足某些限制条件下,求得由小于或等于n个元素组合而成的,全部解或者最优解。 即:1、有约束条件 2、解集合中可包含的元素确定 3、全部解或最优解 步骤: 把解集合,划分成最大层次(n)确定的树状或图状的空间;每一层的节点对应于解的一部分(如第m层对应于是否包含解解集合的第m部分)。
阅读全文
摘要:适用情况: 1. 问题可以分为多个阶段(如用1个的阶段,用2个的阶段,.......) 2. 无后效性: 每个阶段可以由前面的阶段决定(这样就减少了运算),但不能有后面的阶段反过去影响前面阶段 3. 重叠性:各阶段存在重复运算,尤其是后阶段依赖前阶段的结果 步骤: 1. 划分阶段 2. 确定阶段转移
阅读全文
摘要:实现思路:对全部输入或者部分做预处理,得到额外信息从而帮助提升算法效率例子:模式匹配/* * 模式匹配 * 直接思路: * 时空权衡法:对模式串进行预处理,构造出额外的移动信息表 */void makeTable(string pattern, char* table) { // t...
阅读全文
摘要:核心数学式: f = g+ h实现思路: 要求解的问题,如何转化为一个或多个容易求解的问题例子: 最小公倍数(先求乘积;再求最大公约数;再相除);检查数组元素唯一性(先排序;再遍历)
阅读全文
摘要:核心数学式:f(n) = f(n-1) + F; 应用:插入排序;生成排序/子集f(n) = f(n/2) + F; 应用:假币问题;俄式乘法f(n) = f(n-k) + F; 应用:查找第k大/小的元素实现思路:考虑对于元素数量为n的集合的执行结果,如何用数量为n-1、n/2或者n-...
阅读全文
摘要:核心数学式:f(n) = F + f([0,n/2]) + f([n/2,n]) 思路: 适用情景: 对一个很大集合,进行内部元素两两处理(比较大小,或者判断方位) 步骤: 1. 分 把问题集合分为独立的几个小集合 2. 治 各自解决 3. 合 把小集合的解合并成最终解 例子:快排、二叉树遍历、最近
阅读全文
摘要:蛮力法就是以最直观、最直接,从头到尾,从上到下的思维去尝试解决问题。它主要包括以下三种方式:一个一个地解决:冒泡排序尝试所有可能的迭代:顺序查找、模式匹配尝试所有的排列组合:最近点对、背包问题// 冒泡排序void bubble_sort(array[0,..,n]) { for i=0 to...
阅读全文
摘要:目前浅显地看过《数据结构与算法分析》《算法设计与分析基础》两本涉及到算法的书。简单认为,学习算法的重点和难点都不在代码实现上,而在:1、数学逻辑式 这个是写出伪代码的关键2、算法正确性证明 证明该算法能得到最优解还是比较优解数学逻辑式,从两方面考虑:一种是迭代,另一种是递归。迭代思维相对...
阅读全文
摘要:写出算法有一个比较通用的方法论,步骤如下: 1、理解问题 先弄清楚具体要解决什么问题 做成怎样的程度就可以满足问题需要?是需要精确值还是近似值? 2、分析问题 用数学思路去描述问题的求解过程 3、确定适当数据结构和流程控制结构 画出流程图 4、用伪代码表述算法 这是很关键的一步,基本是决定成败的一步
阅读全文