01 2021 档案
摘要:title: 自定义View categories: Android原理 概论 所谓自定义View其实就是在屏幕大小画布的某一区域内作画的过程,这里面分为两个部分:在哪画?,画什么?; 在哪画? 这里面同样包含两部分:获得这片区域的宽高,获得这片区域左上角相较于屏幕左上角的坐标; 至于为什么顺序是这
阅读全文
摘要:整体分发流程 Android Input Framework 这篇详细讲解了触摸事件从硬件分发到Activity之前的过程。 graph TD; a(Input Hardware)-->b(Kernel/Driver); b-->c(EventHub); c-->d(InputReader); d-
阅读全文
摘要:offscreenPageLimit = 0 的情况 此种情况表示不会预先加载其他的Fragment,仅仅加载第一个Fragment,其生命周期如下: Test fragment 0 onAttach Test fragment 0 onCreate Test fragment 0 onCreate
阅读全文
摘要:读书笔记 本小节讲述了两点内容: 合适动态规划算法解决的最优化问题的两个要素 备忘方法在动态规划中的作用 两个要素 最优子结构 一个问题的最优解包含其子问题的最优解 还有一点值得注意,同时还需要满足子问题无关的特性:同一个原问题的一个子问题的解不影响另一个子问题的解。 重叠子问题 某一个子问题可能会
阅读全文
摘要:读书笔记 本小节介绍了利用动态规划解决矩阵链乘法的过程。 穷举不可行 想要通过穷举的方法,获得所有的解决方案是不可行的。 对于一个矩阵链,我们可以宏观地将它看作两个子矩阵链相乘,即和; 所以代价的表达式如下: \[ \begin{align
阅读全文
摘要:读书笔记 说文解字 动态规划(dynamic programming),描述了它区别与其他算法的最大特征; 其中表示的是一种表格法,在动态规划算法执行的过程中,会动态地去将子问题的解填入表格和读取已知子问题的解,以减少不必要的运算; 与分治法的异同 相同点: 都是通过组合子
阅读全文
摘要:读书笔记 本小节介绍了一种红黑树的扩展:区间树; 为每个节点添加了一个新属性,属性又有两个属性,分别表示区间的两端; 区间重叠 区间便于表示占用一连续时间的一些事件。为了查询给定时间内发生的事件,需要在区间树找到与给定时间重叠的部分; 假设在一条直线有左右两个
阅读全文
摘要:读书笔记 本小节介绍了扩展数据结构的抽象过程,同时证明了一个定理; 抽象过程 选择一种基础数据结构 确定基础数据结构中要维护的附加信息 检验基础数据结构上的基本修改操作能否维护附加信息 设计一些新的操作来应用附加信息 红黑树的扩张 设是个节点的红黑树扩张的属性,且假设对任一节点$x
阅读全文
摘要:读书笔记 本小节介绍了红黑树的改进版本,为每个节点新增一个属性,用于记录当前子树的数量; 新增属性是由左子树加右子树再加本身组成,即; 维护数量属性 对红黑树的基本操作过程中,需要持续维护属
阅读全文
摘要:读书笔记 本小节介绍了红黑树的删除操作,这是红黑树的基础操作中比较复杂的一种; 和红黑树的插入的基本思想一致,红黑树的删除也是先将元素普通地删除,然后在调整二叉树使其符合红黑树的性质。 红黑树的元素普通删除 RB-TRANSPLANT(T, u, v) if u.p == T.nil T.root
阅读全文
摘要:读书笔记 本小节介绍了向红黑树插入元素的过程: 将新元素普通地插入二叉树; 调整二叉树使其符合红黑树的性质; 插入元素到二叉树 RB-INSERT(T, z) y = T.nil x = T.root while x != T.nil y = x if z.key < x.key x = x.lef
阅读全文
摘要:读书笔记 本小节介绍了旋转方法来修改搜索树; 如果按照普通二叉搜索树的方式去插入和删除元素,必定会破坏红黑树的性质; 为了维护红黑树的性质,必须要改变书中某些节点的颜色和指针结构; 指针结构的修改是通过旋转实现的,分为左旋和右旋,具体操作如下图: 其中左旋的伪代码如下: LEFT-ROTATE(T,
阅读全文
摘要:读书笔记 本小节介绍了红黑树的一些性质,具体的实现方法在之后的章节中讲述。 红黑树解决的问题 普通的二叉搜索树所有的操作都依赖于树的高度,但是树高又依赖于数据,极不稳定; 红黑树使得元素分布相对平衡,来使得树高为,减少操作时间。 红黑树的性质 每个节点或是红色,或是黑色。 根节点是黑
阅读全文
摘要:读书笔记 本小节介绍了二叉搜索树的插入和删除,至于修改只要先删除后插入就好; 插入 插入的过程和搜索的过程有些相似,先找到合适的位置然后将元素插入; 伪代码如下: TREE-INSERT(T, z) y = NIL x = T.root while x != NIL y = x if z.key <
阅读全文
摘要:读书笔记 本小节介绍了二叉搜索树,二叉搜索树就是左子节点比父节点的值要小,右子节点的值比父节点大的二叉树;这里的小于/大于还包括等于。 INORDER-TREE-WALK(X) if x != NIL INORDER-TREE-WALK(x, left) print x.key INORDER-TR
阅读全文
摘要:读书笔记 本小节介绍了散列表的灵魂--散列函数; 一个好的散列函数应满足简单均匀散列假设:每个关键字都被等可能地散列到个槽位中的任何一个,并与其他关键字已散列到哪个槽位无关。 虽然上述假设难以实现,但是可以作为衡量其他散列函数的标准。 有一些动态集合的元素关键字并不是自然数,我们需要使用各种各
阅读全文
摘要:读书笔记 虽然直接寻址表的所有字典操作能在时间内完成,但是它的缺点也同样明显; 如果某一个元素的关键字特别大,但是动态集合的元素数量又相对少,这就会造成极大的内存浪费;此外,直接寻址表对拥有同样关键字的元素缺乏合理的处理; 散列表改善了直接寻址表的上述缺点: 原本元素在直接寻址表的位置依
阅读全文
摘要:读书笔记 本小节介绍了直接寻址表,其实也就是数组; 为一个动态集合创建一个数组,这个数组长度大于等于这个动态集合的长度,将数组下标作为集合元素的关键字,进行直接寻址,这样的数组被称为直接寻址表。 课后习题 11.1-1 假设一动态集合用一个长度为的直接寻址表来表示。请给出一个查找$
阅读全文
摘要:读书笔记 本小姐介绍了两种有根树的实现方法,二叉树和分支无限制的有根树; 二叉树 二叉树的单个节点有三个指针,其中指向父节点,如果一个节点为根节点,则其父节点指向空;分别指向左子节点和右子节点; 分支无限制的有根树 上面的二叉树虽然好用
阅读全文
摘要:读书笔记 本小节介绍了利用数组实现指针的过程。 利用二维数组 其中一列代表一个节点,一列分为上中下三个部分,上代表后继节点的坐标,中代表当前节点的值,下代表前驱节点的坐标; 利用单数组 其中一个节点由连续的数组元素组成,图中4代表该节点的值,7代表后继节点的坐标,13代表前驱节点的坐标; 这种单数组
阅读全文
摘要:读书笔记 本小节介绍了链表,链表由一个个节点连接而成,单个节点的组成如下: public class Node { public Node previous; public Object key; public Node next; } 由上述节点组成的链表称为双向链表;也有节点只有一个前驱节点或者
阅读全文
摘要:读书笔记 本小节介绍了栈和队列,其实总结起来就两句话: 栈:先入后出 队列:先入先出 但是在介绍队列的时候,讲到了一种如同衔尾蛇一样的定长队列,和apache的CircularFifoQueue实现是一致的。 课后习题 10.1-1 仿照图,画图表示一次执行操作、\
阅读全文
摘要:读书笔记 本小节介绍了一种上界为的选择算法,该算法过程如下: 先对将输入数组以每组5个元素分组,可能会剩余一组不足5个元素的小组。 对每个小组进行插入排序。 对每个小组的中位数,进行递归操作,也就是重复第1,2步骤,直至找到整个数组的中位数。 使用在第三步找出的中位数对数组进
阅读全文
摘要:读书笔记 本小节介绍一种选择算法,用来选择数组中第小的元素; 以快速排序为模型,时间复杂度为。 伪代码如下: RANDOMIZED-SELECT(A, p, r, i) if p == r return A[p] q = RANDOM
阅读全文
摘要:读书笔记 本小节介绍了两点: 如何找到数组中的最大值和最小值? 如何同时找到数组中的最大值和最小值? 找到最小值 最小值和最大值的方法是一致,从数组中取出一个值,然后和其他的个值相比较,不断更新最大值/最小值,经过次比较,可以获得最大值/最小值。 同时找到最大值和最小值 如果没有
阅读全文
摘要:读书笔记 本小节介绍了桶排序,桶排序是将元素按照规则放在一个个递增区间内,区间之间是递增的,区间内部也是递增的,最后依次合并区间得到次序; 具体过程如下: 伪代码如下: BUCKET-SORT(A) n = A.length let B[0..n-1] be a new array for i =
阅读全文
摘要:读书笔记 本小节讲的是基数排序,与比较排序不同,基数排序并不是直接比较元素间的大小获得次序,而是从低位到高位依次排序,最终获得次序; 具体过程如下: 伪代码如下: RADIX-SORT(A, d) for i = 1 to d use a stable sort to sort array A on
阅读全文
摘要:读书笔记 本小节介绍了计数排序,计数排序的基本思想是: 对每个输入元素,确定小于的元素个数。利用这一信息,就可以直接把放到它在的输出数组中的位置上了。 所以这里的重点是如何确定小于的元素个数,这里引入了一个数组,的长度为,的值要大于等于输入数组中的最大
阅读全文
摘要:读书笔记 本小节通过决策树模型,说明了一个比较排序算法的下界为; 课后习题 8.1-1 在一棵比较排序算法的决策树中,一个叶节点可能的最小深度是多少? 最好情况就是当前数组是已经排好序的,需要比较次;深度为 8.1-2 不用斯特林公式,给出$\lg{(n!
阅读全文
摘要:读书笔记 为了使得算法对所有输入都能有较好的期望性能,所以我们在算法中引入了随机性; 伪代码如下: RANDOMIZED-PARTITION(A, p, r) i = RANDOM(p, r) exchange A[r] with A[i] return PARTITION(A, p, r) RAN
阅读全文
摘要:读书笔记 本小节对快速排序在三种情况下的性能进行了分析,我自觉没有书上说得好,所以直接上图片。 最好和最坏情况 平均情况 课后习题 7.2-1 利用代入法证明:正如7.2节开头提到的那样,递归式的解为。 易证,
阅读全文
摘要:读书笔记 本小节介绍了大名鼎鼎的快速排序,快速排序在最坏的情况下的时间复杂度为;在元素互异的情况下,期望时间复杂度为。快速排序使用了分治思想,分治过程如下: 分解 数组被划分为两个(可能为空)的子数组和$A[q+1.
阅读全文
摘要:读书笔记 本小节讲述了堆排序在实际中的应用--优先队列,优先队列可以在共享计算机操作系统进行作业调度。 最大优先队列支持如下操作: 插入 将元素根据它的优先级插入到合适的位置; 实现过程 在最大堆的最末端插入一个无穷小的叶子节点,然后为这个节点赋值,然后使用递归调整该节点到合适位置; 伪代码
阅读全文
摘要:读书笔记 之前说过降序数组都是最大堆,但是反之不然,本小节讲述的是从最大堆中获取降序数组的过程; 伪代码如下: HEAPSORT(A) BUILD-MAX-HEAP(A) for i = A.length downto 2 exchange A[1] with A[i] A.heap-size =
阅读全文
摘要:读书笔记 本小节讲述了将数组转化为最大堆的过程,伪代码如下: BUILD-MAX-HEAP(A) A.heap-size = A.length for i = A.length/2 downto 1 MAX-HEAPIFY(A, i) 课后习题 6.3-1 参照6-3的方法,说明$BUILD-MAX
阅读全文
摘要:读书笔记 本小节主要讲述了将一个数组变成最大堆的过程; 事实上还是比较简单的,这里使用了递归的方法; 分解 将堆分为左堆和右堆 解决 递归地将左堆和右堆变成最大堆 合并 合并左堆和右堆变成整体的最大堆 课后习题 6.2-1 参照图6-2的方法,说明在数组$A=<
阅读全文
摘要:读书笔记 本小节首先介绍了__堆__的概念,然后又介绍了__二叉堆__的两种形式:最大堆和最小堆; 其中图是物理上的结构。如何从物理上的结构映射到逻辑的结构,通过下方的简单的函数进行映射。 最大堆 所有的父节点都__大于等于子__节点。 最小堆 所有的
阅读全文
摘要:读书笔记 本小节分为两部分,第一部分陈述随机算法的必要性,第二部分介绍了两种随机算法并且证明了它们的正确性; 一个算法的执行效率需要一个随机算法的输入来检验; 优先级排序随机算法 过程如下: 为数组每个元素 赋一个随机的优先级,然后依据优先级对数组中的元素进行排序。 伪
阅读全文
摘要:读书笔记 本小节分为两部分,第一部分用复杂的语言讲解期望的计算方法,即值和概率乘积之和;第二部分使用第一部分讲述的方法计算期望; 有一个值得注意的地方,的证明过程可以在附录A的A.2中找到。 \[ \sum_{k=1
阅读全文
摘要:读书笔记 本小节并没有讲太多东西,但是最后一句话有一些意义; 一般而言,当概率分布实在算法的输入上时,我们讨论的是平均情况运行时间;当算法本身做出随机选择时,我们讨论其期望时间。 课后习题 5.1-1 证明:假设在过程HIRE-ASSISTANT的第4行中,我们总能决定哪一个应聘者最佳,则意味着我们
阅读全文
摘要:读书笔记 使用主方法,往往能够更加简便地求解递归式; 上述递归式表示,将原来规模为的问题分解为个子问题,每个子问题的规模为,其中和都是正常数。个子问题递归地进行求解,每个花费时间为。函数$
阅读全文
摘要:读书笔记 本章主要讲解了使用递归树方法求解递归式; 在递归树中,每个节点表示一个单一子问题的代价,子问题对应某次递归函数调用。我们将树中每层中的代价求和,得到每层代价,然后将所有曾的代价求和,得到所有层次的递归调用的总代价。 递归树适合用来生成好的猜测,然后可用代入法来验证猜测是否正确,但是在某种程
阅读全文
摘要:读书笔记 代入法求解递归式分为两步: 猜测解的形式。 用数学归纳法求出解中的常数,并证明解是正确的。 但是并不存在通用的方法来猜测递归式的正确解,但是也是有一些技巧的: 使用递归树辅助猜测 先猜测一个较为宽松的上界和下界,然后缩小范围 课后习题 证明:的解为$O(n
阅读全文
摘要:读书笔记 本章主要讲述了用于矩阵乘法的Strassen算法; 首先使用暴力算法给出了矩阵乘法的一个解,由于使用了三重循环,所以时间复杂度为; 然后使用分治法给出一个解,但是时间复杂度并没有优于暴力算法,仍然是; 最后引出了Strassen算法,能在
阅读全文
摘要:学习笔记 本章给出一张未来17天的股价涨跌折线图,要求获得最大收益; 将相邻的价格相减,把问题转化为求解最大子数组问题,其输入是一个数值数组,算法需要确定具有最大和的连续子数组; 分解 将数组分为左右两块 解决 最大子数组的产生一共有三种基本情况: 左子数组(向下递归) 右子数组(向下递归) 包含左
阅读全文
摘要:读书笔记 这一章节主要是回顾了一些关于数学的内容,下面是其中的重要内容。 多重函数 我们使用记号来表示函数重复次作用于一个初值上。形式化地,假设为实数集上的一个函数。对非负整数,我们递归地定义 \[ f^{(i)}(n)= \begi
阅读全文
摘要:转载自 https://www.zybuluo.com/codeep/note/163962 一、公式使用参考 1.如何插入公式 的数学公式有两种:行中公式和独立公式。行中公式放在文中与其它文字混编,独立公式单独成行。 行中公式可以用如下方法表示: 独立公式可
阅读全文
摘要:读书笔记 渐近记号用来刻画算法的运行时间,但是想要综合性的覆盖所有的输入,需要不同的渐近记号; 记号,确定一个算法的渐近上界和渐近下界,具体定义如下: = {: 存在正常量和和,使得对所有的,
阅读全文
摘要:(在归并排序中对小数组采用插入排序) 虽然归并排序的最坏情况运行时间为,但插入排序中的常量因子可能是的它在较小时,在大多数机器上运行得较快;因此,在归并排序中,当子问题的规模足够小时,采用插入排序的方法
阅读全文
摘要:读书笔记 首先是递归和分治的思想; 递归:在函数内部再次调用函数本身,但是这个再次调用所处理的问题要小于上一次调用,函数参数也并不相同; 分治:将原问题分解为几个规模较小但是类似原问题的子问题,然后递归地求解这些问题,最后在合并这些子问题的解来建立原问题的解; 详细讲一下分治: 分解原问题为若干子问
阅读全文
摘要:读书笔记 分析算法帮助我们选出某个问题的更优算法; 我们应该使用一个统一的标准去衡量算法的优劣,此处使用——RAM(random-access machine),一个通用的单处理器计算模型。 RAM模型对各种指令的执行时间定义为常量,注意,对于不同的指令该常量值不同; 对于插入排序,数据规模n和执行
阅读全文
摘要:读书笔记 原址排序: 在排序过程中,只有常数个数据存储在数组外; 插入排序工作过程: for j = 2 to A.length key = A[j] // insert A[j] into the sorted sequence A[1, j-1] i = j - 1 while i > 0 an
阅读全文
摘要:读书笔记 算法无论如何总是必要的。 同样的问题,使用不同的算法结果可能天差地别。 课后习题 1.2-1 给出在应用层需要算法内容的应用的一个例子,并且讨论设计的算法功能。 在android studio中需要对strings.xml按照字母顺序排序,使得文件内容更加有秩序; 1.2-2 假设我们正比
阅读全文
摘要:读书笔记 定义 算法 是有输入输出的计算过程。 算法解决的问题 解决当前未能解决的问题 为当前已经解决的问题提供更好的解决方案 算法的指标 速率,解决同样的事情所需要的时间。 课后习题 1.1-1 给出现实生活中需要排序的一个例子或者现实说中需要计算凸壳的一个例子? 拍照时,需要按照身高排序; 1.
阅读全文
摘要:使用Windows和Ubuntu双系统的同学可能会发现这样的问题,在双系统切换的时候,总会有一个系统的时间不对,这两个系统的显示时间一般是相差8小时。 原因 这是因为这两个系统对于硬件时间处理方法不同,Windows将机器时间视为本地时间,而Ubuntu将机器时间视为相对时间,真正用于显示的本地时间
阅读全文
摘要:之前使用Chocolatey这个在Windows下的包管理器,在使用了一段时间后发现了一些问题: 软件没有集中安装在一个目录下 软件所安装的目录下文件无法编辑 命令行软件更新出错 问题 软件没有集中安装在一个目录下 对于这个问题,官方的文档如下: Where are Chocolatey packa
阅读全文