环形队列

最近看书看到环形队列,想起以前好像接触过

  1. 力扣622.设计循环队列
  2. 记得以前看过介绍安卓的logcat就用到环形队列

力扣622的介绍

以下内容引用自力扣的题解

循环队列是一种线性数据结构,其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。也被称为“环形缓冲器”。

任何数据结构中都不存在环形结构,可以用一维数组、单链表 模拟。对于一个固定大小的数组,任何位置都可以是队首,只需要知道队列的长度,就可以计算出队尾的位置

_config.yml

公式:tailIndex = (headIndex + count - 1) % capacity (count为当前队列长度,capacity为循环队列可容纳的最大元素数量)

设计数据结构的关键是如何设计属性,好的设计属性会更少

  1. 属性少说明属性间的冗余低
  2. 属性冗余度越低,操作逻辑越简单,发生错误的可能性更低
  3. 属性少,使用空间即少,操作性能更高 一定的冗余可以降低操作的时间复杂度,达到时间复杂度与空间复杂度的相对平衡

_config.yml 自己手动画了个图,有点粗糙

仔细想想,小学时有没有数学上有没有做过种树的题目,有种树路线是一条线的,有种树路线为一个圈的…所以这里是不是只用到了小学的数学知识

这里是用数组实现的,还可以用链表,还有线程安全的版本

日志记录

在程序的生命周期中,尤其是在程序发生不明显的故障时,有效的日志记录就会变得很重要。日志记录可提供程序发生故障之前的详细的状态信息。(如果交付的程序中用户反馈的bug自己却无法重现的话,想修复还是蛮难的)

常规的文件记录的两个难题为 硬盘上的空间可用性、文件I/O速度;

空间问题常通过使用日志轮换策略解决,即日志策略为保存在多个文件中,文件在达到预定义长度时会被截断并覆盖。

磁盘读写速度满的问题,通过先将数据记录存在内存中,在需要的时候再将其转存,以减少IO的次数,这里常见的方式为环形缓冲区。(类似于UI渲染的时候,合并多次更新/vue刷新的时候,合并多次变更等)

Logcat

待补充…


引用源

Written on January 4, 2021