【iOS重学】从LCS到IGListKit框架中的Diff算法(下)
写在前面在上一篇文章从LCS到IGListKit框架中的Diff算法(上)中我们详细讲了 $LCS$ 是什么、怎么使用动态规划来求解 $LCS$ ,最后我们也抛出了 $LCS$ 还存在的两个问题,本篇文章我们就主要来分析IGListKit框架中的Diff是如何来解决这两个问题的。
温馨提示:本文主要剖析IGListKit框架中的Diff算法,不会讲IGListKit框架的具体使用。
$LCS$ 存在的问题带来的思考上一篇文章我们提出了 $LCS$ 存在的两个问题:
但是当n特别大的时候,$O(n^2)$ 这个时间复杂度依然比较可怕。
希望对新、旧数据都存在的元素的Move进行一些优化,而不是简单的Delete、Insert操作。
Instagram团队的IGListKit框架结合Paul Heckel’s Diff(1978年)的一篇论文做了进一步的优化,使用一些额外的内存空间,把时间复杂度降低到了$O(n)$ ,并且能够准确获取数据元素的Move/Insert等操作。
这里,我们还以上一篇文章的两个序列为例:
$X = <A,D,F,G,T>$ ...
【iOS重学】从LCS到IGListKit框架中的Diff算法(上)
什么是LCS子序列假设有两个序列 X, Z:
$X = <x_1,x_2,x_3,……x_m>$
$Y = <y_1,y_2,y_3,……y_n>$
若 Z 序列中的每个元素都能在 X 中找到,并且是严格递增的,那么就称 Z 是 X 的子序列。
公共子序列Z 既是 X 的子序列, 也是 Y 的子序列,则称 X,Y 的公共子序列是 Z,公共子序列长度为元素的个数。
最长公共子序列最长公共子序列(Longest Common SubSequence),简称 LCS,指的是两个序列中元素个数最多的公共子序列。
$LCS$的广泛应用LCS 是一个经典的计算机科学问题,也是数据比较程序,LCS主要应用在:
Git等版本控制中文件的对比
一些做图片、文件、文本等对比的软件
IGListKit框架中的Diff算法来做UICollectionView的刷新
如何求两个序列的$LCS$给定两个序列:
$X = <x_1,x_2,x_3,……x_m>$
$Y = <y_1,y_2,y_3,……y_n>$
求 X,Y ...
【Hexo】Twikoo评论系统配置教程
写在前面Hexo博客里面支持的评论系统有:Disqus、Disqusjs、Livere、Gitalk、Valine、Waline、Utterances、Facebook Comments、Twikoo、Giscus,这里面有的评论有的是国外的服务器、有的有广告,本文要讲的Twikoo是在butterfly3.3之后支持的,它支持邮件提醒、微信提醒等功能,还是非常好用的。
注意:本文仅针对腾讯云的部署方式中的「手动部署」,其他详细部署方式请参考官方文档。
购买云开发套餐温馨提示:如果你已经拥有云开发环境,可以忽略这一步,直接到【登录授权】。
1、进入云开发CloudBase,进行登录、实名认证操作,点击控制台:
2、点击云产品,选择云开发CloudBase:
3、点击新建,选择空模板,点击下一步:
4、选择合适的套餐进行购买:
温馨提示:
地域选择【上海】
计费方式选择【包年包月】
环境名称自由填写
套餐版本选择【特惠基础版1】
5、按照上面的步骤操作之后,我们会拥有一个云开发环境:
注意:记录一下这个环境ID,我们后面会用。
登录授权环境 - 登录授权 - 开启 ...
【iOS重学】消息发送的完整流程
写在前面 在OC里面,调用对象的某个方法其实就是给这个对象发送一个消息,这个过程我们把它分为三大阶段,分别为:消息发送阶段、动态解析阶段、消息转发阶段,本文将细细剖析这三个阶段,但是在剖析这三大阶段之前我们需要先回顾一下Class的结构。
Class结构苹果源码最新下载地址请点击:苹果源码在objc-runtime-new.h中可以看到objc_class结构如下:
struct objc_object { Class isa;};struct objc_class : objc_object { Class superclass; cache_t cache; // 方法缓存 class_data_bits_t bits; // 获取具体类信息 ...... };
从上面的结构我们可以看到有一个类cache_t,这个类就是专门拿来做方法缓存相关的类,结构如下:
struct cache_t { struct bucket_t *buckets(); uint16_t _o ...
【Hexo】Butterfly 如何替换jsdelivr提升网站访问速度
写在前面大家都知道jsdelivr,而且经常用这个CDN服务,这是一个很快而且免费的CDN服务,但是从去年还是啥时候开始就逐渐出现挂掉,不太好用的情况,前段时间更是大规模的挂掉,对我最直接的影响就是:我这个博客网站打开就是巨慢无比,控制台一堆报错,各种图片无法显示,这对于一个强迫症来说真的不能忍,于是打算换掉Butterfly主题下的jsdelivrCDN服务。
解决办法办法一这种方法超级简单,只需要简单的一步:
butterfly主题下 - scripts - events - config.js文件 修改jsdelivrcdn。
将https://cdn.jsdelivr.net 换成 https://fastly.jsdelivr.net或https://gcore.jsdelivr.net
其中fastly是美国的服务器,gcore是俄罗斯的服务器,两个都亲测好用,嫌弃麻烦的同学可以直接替换成这个,访问速度目前来看还是很快的。
办法二修改butterfly主题中的_config.yml文件:
将third_party_provider由jsdelivr换成local:
替换 ...
【iOS重学】启动优化(一)
APP是如何启动的APP启动热启动:系统里面存在APP的进程缓存信息,比如杀掉APP后短时间内重启APP。
冷启动:系统里面没有APP的进程缓存信息,例如重启手机打开应用、APP长时间不用系统替换掉已有的进程缓存。
APP的启动流程图如下:
main函数之前main函数之前所干的事大概可以总结为:
dyld:动态链接器,把所有的可执行文件所依赖的动态库递归加载到内存中。
rebase/bindging:rebase 是指调整镜像内部的指针,binding是指绑定外部函数的指针。
objc setup:Runtime的初始化,对class和category注册,对selector的唯一性判断。
load & initialize & constructor:调用所有类的+load方法,初始化C&C++静态常量,调用__attribute__((constructor))修饰的函数。
总结为如下图:
其他的都很好理解,我这里重点解释一下rebase和binding到底在干什么?
rebase & binding
虚拟内存 & 物理内存
物理内存: ...
【Hexo】Butterfly主题配置(持续更新)
升级建议为了减少升级以后带来的不便,建议请按照下面的方式进行操作:
在博客根目录下创建一个文件:_config.butterfly.yml,并把butterfly主题目录下的_config.yml内容复制到该文件中(注意:复制的是butterfly主题目录下的_config.yml不是博客根目录中的_config.yml)。
以后只需要在_config.butterfly.yml文件里进行修改即可。
注意:butterly主题目录下的_config.yml不要删除,不要删除,不要删除,重要的事情说三遍。
注意:如果你项目中使用了_config.butterfly.yml文件,在主题目录下的_config.yml修改不会有效果。
如图,以后我们只需要关注这两个配置文件即可:
scaffolds文件夹博客目录下有一个文件夹scaffolds,这个是模版文件夹,当我们新建页面或者文章时,hexo 会根据scaffolds来建立文件。
顾名思义,模版就是指新建的文章或页面默认的内容,比如我修改了scaffolds下的post.md:
这样每次我新建的文章顶部都有这些默认内容,能添加 ...
【Hexo】如何拥有一个自定义域名的Hexo博客
如何拥有自己的域名在这篇文章中我们利用Hexo和Github搭建了自己的博客,搭建出来的博客地址格式都是:https://+Github博客仓库名.github.io
比如我的博客地址就是:https://happycodersunny.github.io
是不是觉得不好看,大家的网址都长一样,好像是流水线上生产出来的一样,那么怎么替换成自己的域名显得更个性化呢?
购买域名首先一个普通的域名也不贵,你可以上XX云买一个自己喜欢的域名,我这里以阿里云为例:
在购买的时候需要你实名,就按照要求填写相关信息即可,填写之后需要一会的审核时间,一般还是很快的。
如果你实在是不想花钱买域名也可以在这里免费注册一个域名,具体注册和解析步骤可以参考知乎文章。
域名解析购买域名之后我们还需要对域名进行解析之后才能使用。
在这里面添加两条记录如上所示。
记录类型为A的四个记录值是Github page官网说的四个记录值,好多文章写的192开头的两个已经不是最新的了,大家最好还是对照Github Pages进行设置,也可以使用ping xxx.github.io来验证一下。
记录类型为CNAME的记录 ...
【Hexo】Hexo博客备份到Github
为什么要备份在这篇文章中我们把Hexo 和 Github结合起来搭建了自己的个人博客,hexo d部署到Github的其实Hexo编译后的文件,这些文件是用来生成网页的,并不包含我们的源文件:
它其实上传到Github 的是在我们本地目录里的.deploy_git里面的内容:
我们的源文件比如相关source 文件、配置文件等都是没有上传到Github上的,所以我们要利用git来做分支管理,对我们的源文件进行备份,这样我们就可以在另一台电脑上把源文件clone到本地安装相应的环境就可以继续写我们的博客了。
好了,废话少说,我们直接来说如何进行博客源文件的备份。
Hexo 博客备份创建新分支在Github上博客仓库下创建一个新的分支hexo,并且将这个分支设置为默认分支,具体操作如下:
克隆Hexo分支在本地把我们刚建的分支hexo克隆到本地:
把克隆下来的项目里面的.git文件复制到我们的Hexo博客目录下:
注意:如果之前搭建博客的时候自己更换过主题文件的,请把主题文件里面的.git文件删除。
开始备份进入到Blogs根目录下,执行如下命令:
git add .gi ...
【Hexo】Mac OS上使用Hexo + Github搭建博客教程
Hexo介绍Hexo是一个快速、简洁且高效的博客框架,具体可以见Hexo官网,它在github上的star数现在已经到34.7k,Hexo主要有以下特点:
超快速度:Node.js所带来的超快生成速度,可以让上百个页面在几秒内完成渲染。
支持Markdown:Hexo 支持 GitHub Flavored Markdown 的所有功能,甚至可以整合 Octopress 的大多数插件。
一键部署:只需一条指令即可部署到 GitHub Pages, Heroku 或其他平台。
插件或可扩展性:强大的 API 带来无限的可能,与数种模板引擎(EJS,Pug,Nunjucks)和工具(Babel,PostCSS,Less/Sass)轻易集成。
安装环境安装Node.js下载地址:Node.js
安装淘宝镜像// 使用命令安装淘宝镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org
安装Hexo// 使用命令去安装Hexocnpm install -g hexo-cli
安装成功安装成功后,使用 ...