摘要:
位运算 Bitwise operations 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。 常见位运算符: 编程常用的位运算操作 x & 1 == 1 or == 0 判断 x 的二进制最后是 1 还是 0,即判断奇偶性(x % 2 == 1) x = x & (x - 阅读全文
摘要:
哈希函数 通过哈希表可以实现 O(1) 复杂度的查找。 哈希函数构造方法:设计好的哈希函数的两个基本原则,计算简单+分布均匀 1. 直接定址法 用key自身的某个线性函数来定址,f(key) = a*key + b。但需要知道关键字的分布情况。 2. 数字分析法 适合处理关键字位数比较大的情况。抽取 阅读全文
摘要:
1. 链表中环的入口节点 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路一:用哈希表存已经遍历过的节点,O(1)复杂度查找,如果再次遇到就是环入口 思路二:快慢指针 2. 删除链表中重复的节点 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点 阅读全文
摘要:
排序算法的稳定性:一个稳定的排序算法,如果两个等值键R和S在排序前后次序不变,称其是稳定的 例如排序之前的序列为:(4, 1) (3, 1) (3, 7)(5, 6) (3, 1) (3, 7) (4, 1) (5, 6) 维持次序,稳定 (3, 7) (3, 1) (4, 1) (5, 6) 次序 阅读全文
摘要:
静态查找:数据集合稳定,不需要添加删除元素的查找操作。 动态查找:查找过程中需要同时添加或删除元素。 查找结构 静态:线性表 动态:二叉排序树、哈希 1. 顺序查找:遍历待查数组,逐个与关键字比较,匹配则查找成功。O(n) 2. 二分查找 数组必须要有序;数组存在明确的上下界;能够通过索引访问(所以 阅读全文
摘要:
多对多关系。顶点的有穷非空集合和顶点之间边的集合构成,表示为G(V, E)。 数据元素在线性表中叫元素、树中叫结点、图中叫顶点vertex。边无方向称为无向边,用无序偶(Vi, Vj)来表示。有向边(也称为弧)用有序偶<Vi, Vj>来表示。<弧尾,弧头> 基础概念 简单图:不存在顶点到自身的边,且 阅读全文
摘要:
树:n(n>=0)个节点的有限集。有且只有一个root,子树的个数没有限制但互不相交。结点拥有的子树个数就是该结点的度(Degree)。度为0的是叶结点,除根结点和叶结点,其他的是内部结点。结点的层次(Level)从根结点开始从1计数,树中结点的最大深度称为树的深度(Depth)。树中结点的子树看成 阅读全文
摘要:
用数值模拟非数值,比如ASCII码表 string:由零个或多个字符组成的有限序列 字符串的存储结构和线性表一样,也分顺序存储和链式存储,习惯上还是用顺序表。 子串匹配: Brute Force 算法 朴素的模式匹配方法,按字符依次匹配,一个文本串s和一个模式串p,查找p在s中的位置,最坏时间复杂度 阅读全文
摘要:
递归 Recursion 通过函数体来进行的循环,一种编程技巧。倒着思考,看到问题的尽头。思路简单但效率低(建立函数的副本,消耗大量时间和内存)。递归是分治和动态规划的基础,而贪心是动态规划中的一种特殊情况(局部最优也是全局最优)。 终止条件(最简子问题的答案) + 自身调用(解决子问题),不要试图 阅读全文
摘要:
栈 一种重要的线性结构;后进先出。特殊的线性表,只能在表尾进行插入(push)和删除(pop)操作。 表尾称为栈顶(top),表头称为栈底(bottom)。一般用顺序表实现。 清空一个栈:s->base = s->top 销毁一个栈:释放其所占的物理内存空间。 for(i=0, i<s->stack 阅读全文