<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Jali_li的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Jali_li</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Jali_li]]></copyright><item><title><![CDATA[iOS敏感词过滤，DFA算法的OC实现]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/52843576</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/52843576</guid><author>Jali_li</author><pubDate>Mon, 17 Oct 2016 23:07:27 +0800</pubDate><description><![CDATA[最近给项目加个屏蔽敏感词的功能，在网上搜了一遍基本都是使用DFA算法由敏感词构造树，然后按照遍历输入文本，每次从树的根节点往下匹配，匹配成功则替换成*之类的即可，搜了一圈没有发现OC版的算法，故按着算法用OC写了一遍，分享一波。
  类定义如下：

#import "WordFilter.h"

#define EXIST @"isExists"

@interface WordFilter]]></description><category></category></item><item><title><![CDATA[Android之内存缓存——LruCache的使用及原理]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51607497</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51607497</guid><author>Jali_li</author><pubDate>Tue, 07 Jun 2016 23:33:57 +0800</pubDate><description><![CDATA[Android的缓存方法有内存缓存和磁盘缓存，像一些实时的图片展示一般都是用内存缓存的，例如微博、朋友圈的图片；而一些相对固定的图片数据比如有些客户端的图片资源需要从网上下载然后存到磁盘中，以后每次启动只需从缓存中获取即可。今天就来探究一下内存缓存的实现及其原理。
Android的内存缓存使用LruCache类实现，如果容器已满，就使用LRU置换算法替换掉某个数据。什么是LRU置换算法呢？
L]]></description><category></category></item><item><title><![CDATA[Java的反射机制与动态代理学习笔记]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51521034</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51521034</guid><author>Jali_li</author><pubDate>Sat, 28 May 2016 01:52:49 +0800</pubDate><description><![CDATA[最近在补Java基础，看到了类型信息这块知识，记起某些Android api和一些库里都有用到反射或动态代理的知识，特此探究一番。
一、反射

首先百度到的定义：JAVA反射是在运行状态中，对于任意一个类，都能获取这个类的所有属性和方法，对于任意一个对象，都能够调用它的任意一个方法和属性；这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

看定义能够知道反射就是]]></description><category></category></item><item><title><![CDATA[Java+Android实现DES与四种模式、AES、MD5算法三合一]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51485838</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51485838</guid><author>Jali_li</author><pubDate>Mon, 23 May 2016 23:52:44 +0800</pubDate><description><![CDATA[上密码学实验课要求程序实现DES、AES和MD5三个算法，就用较熟悉的Java并顺便在Android上写个界面。
github地址：https://github.com/w3cboss/DES
实现DES算法时走了点弯路，输入输出都用十六进制数字，中间转化为二进制字符串后又转化为boolean型的ArrayList进行各种中间操作，多此一举了，后面也懒得改了。。
AES同样用十六进制数字作输]]></description><category></category></item><item><title><![CDATA[数据结构(c)——排序算法]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51405427</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51405427</guid><author>Jali_li</author><pubDate>Sat, 14 May 2016 13:19:33 +0800</pubDate><description><![CDATA[排序是将一个记录的任意序列，重新排列成一个按关键字有序的序列(按非递减或非递增)。
排序算法按排序过程中依据的不同原则可以大致分为五类：插入排序、交换排序、选择排序、归并排序、基数排序。
下面程序均使无序序列排序成非递减序列。
数据结构使用顺序表，并初始化8个元素 [49,38,65,97,76,13,27,49]，
typedef struct  Record{
	int key;]]></description><category></category></item><item><title><![CDATA[数据结构(c)——赫夫曼树与赫夫曼编码]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51307311</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51307311</guid><author>Jali_li</author><pubDate>Tue, 03 May 2016 20:03:02 +0800</pubDate><description><![CDATA[二叉树的一个重要应用——赫夫曼树(最优二叉树)，即所有叶子结点的平均带权路径最短。
赫夫曼算法叙述如下：
（1）根据给定的n个权值{w1,w2,...wn}构成n棵二叉树的集合F={T1,,T2,...,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点，其左右子树均空；
（2）在F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树，且置新的二叉树的根结点的权值为其左、右子树上]]></description><category></category></item><item><title><![CDATA[数据结构(c)——二叉树]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51287878</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51287878</guid><author>Jali_li</author><pubDate>Sat, 30 Apr 2016 21:14:47 +0800</pubDate><description><![CDATA[二叉树的顺序结构只适用于完全二叉树(与满二叉树的结点编码一一对应的二叉树)，否则最坏的情况一个深度为k且只有k个结点的单支树却需要2的k次方-1个单位的存储空间。
即二叉树一般用链式结构，链式结构又有二叉链表和三叉链表。不同之处在于三叉链表多了一个指针域保存指向其双亲的指针，当所有空链域都用来保存其他信息如前继或后继，就成了线索链表。
二叉链表需要一个值域，分别指向左、右子数的指针，定义如下：]]></description><category></category></item><item><title><![CDATA[对ViewPager+Fragment的懒加载的小小探究]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51279774</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51279774</guid><author>Jali_li</author><pubDate>Fri, 29 Apr 2016 10:22:52 +0800</pubDate><description><![CDATA[在网上搜索了一些ViewPager+Fragment懒加载的实现方法，基本都是利用setUserVisibleHint()方法中判断当前fragment是否可见，可见则执行加载操作。懒加载frgment父类提供一个加载数据的抽象方法:
public abstract class LazyFragment extends Fragment {
    protected boolean isVis]]></description><category></category></item><item><title><![CDATA[数据结构(c)——队列]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51229009</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51229009</guid><author>Jali_li</author><pubDate>Sat, 23 Apr 2016 23:11:51 +0800</pubDate><description><![CDATA[队列是先进先出(FIFO)的线性表，元素从队尾进从队头出，有的时候也是比较常用的，同样分为顺序存储结构和链式存储结构，其中顺序存储结构可以实现循环队列。
1、链式队列
首先同样先定义结构体，同样队列应包含有队头指针和队尾指针，分别指向头结点和队尾结点，而指向的结点需有数据域和指向下个结点的指针域：
#include 
#include 
#include 

typedef struct Q]]></description><category></category></item><item><title><![CDATA[数据结构(c)——栈]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51199803</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51199803</guid><author>Jali_li</author><pubDate>Wed, 20 Apr 2016 12:41:35 +0800</pubDate><description><![CDATA[数据结构中栈还是比较常用的，在某些特定情况下非常便利，例如进制转化等。
栈又称为后进先出的线性表(LIFO),同样分为顺序栈和链式栈，实现起来顺序栈和顺序表差不多，链式栈和链式队列差不多而且更加简单。


顺序栈的实现
和顺序表类似，首先定义宏，存储空间初始分配量和每次再分配的增量，以及结构体表示数据结构。

#include 
#include 
#include     //定义]]></description><category></category></item><item><title><![CDATA[数据结构(c)——线性表：顺序表和链式表]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51168343</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51168343</guid><author>Jali_li</author><pubDate>Sat, 16 Apr 2016 15:26:34 +0800</pubDate><description><![CDATA[因为已经大三下学期，准备暑假找实习，以前学得渣，这段时间恶补下基础！！数据结构和算法搞起
线性表包括顺序存储和链式存储两种形式。
1、顺序表
首先定义宏，为线性表分配初始内存空间和再分配用
定义结构体，内部定义指针作为线性表的基址，动态分配后就可以用下标访问，跟数组一样，数组a[10]，a是指向第一个元素的指针，
#define LIST_INIT_SIZE 100    //首次分配的]]></description><category></category></item><item><title><![CDATA[AndroidStudio下初涉NDK开发]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/51068747</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/51068747</guid><author>Jali_li</author><pubDate>Tue, 05 Apr 2016 22:13:39 +0800</pubDate><description><![CDATA[虽然具体还没有需要用到NDK开发，但先了解一下也是好的，所以搭建了一下NDK环境并配置尝试第一个helloworld，在网上找了很多文章，都略微有点不清楚，在此整理总结一下在AndroidStudio开发JNI过程。
一、下载NDK，配置环境变量
 看了个网上视频教程是在eclipse下，需要用NDK的命令行，发现在AndroidStudio下不用，方便极了。。NDK翻墙到官网下，或者百度，这]]></description><category></category></item><item><title><![CDATA[零碎笔记——Git的简易使用]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/50976312</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/50976312</guid><author>Jali_li</author><pubDate>Fri, 25 Mar 2016 00:08:44 +0800</pubDate><description><![CDATA[知识还是自己稍加整理、总结的好。项目开发的时候可能会用到版本控制器，学着使用了一会Git，总结一下简单常用的知识。
      版本控制器顾名思义就是能控制提交项目的历史版本，每提交一次就是一个版本，随时可以回退到各个历史版本。Git是分布式版本控制器，在自己本地就能用得很嗨，当然也可以推送到远程仓库如Github公开自己的项目或者说和队友共同开发等等。
  一、使用准备
       安装]]></description><category></category></item><item><title><![CDATA[Android Studio获取SHA1、MD5以及申请第三方平台key]]></title><link>https://blog.youkuaiyun.com/Jali_li/article/details/50858002</link><guid>https://blog.youkuaiyun.com/Jali_li/article/details/50858002</guid><author>Jali_li</author><pubDate>Fri, 11 Mar 2016 18:05:38 +0800</pubDate><description><![CDATA[这两天在写些定位天气之类的demo，因此到高德开发者平台上申请SDK，大家都知道使用这些第三方平台都要为自己的应用申请唯一的key，申请key就需要查看数字签名的SHA1或MD5码，这两天找了相关的内容，加以整理作为学习过程的总结，也希望能给到同样有疑惑的初学者们哈。
       首先，我们的IDE打包出来的APK文件分为两种，debug（调试）版和release（发布）版，在studio或e]]></description><category></category></item></channel></rss>