西维蜀黍

【Data Structure】线性表(Linear List)

线性表(Linear List)

基本概念

线性表(List):由零个或多个数据元素组成的有限序列。

  • 线性表是一个序列。
  • 0个元素构成的线性表是空表。
  • 线性表中的第一个元素无前驱,最后一个元素无后继,其他元素有且只有一个前驱和后继。
  • 线性表是有长度的,其长度就是元素个数,且线性表的元素个数是有限的,也就是说,线性表的长度是有限的。

如果用数学语言来进行定义,可如下:

若将线性表记为(a1,…,ai-1,ai,ai+1,…an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。


数组,链表、队列、栈等都是线性表结构。

而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。

  ...


【Data Structure】图(Graph)

图(Graph)

我们知道,数据之间的关系有 3 种,分别是 “一对一”、“一对多” 和 “多对多”,前两种关系的数据可分别用线性表和树结构存储,本节学习存储具有"多对多"逻辑关系数据的结构——图存储结构。

  ...


【Algorithm Problem】统计文章中每个单词出现的次数

Solution

String[] strs = {"apple",...};
Map<String, Integer> map = new HashMap<String, Integer>();
for (String str : strs) {
    if (map.containsKey(str)) {
        Integer integer = map.get(str);
        integer++;
        map.put(str, integer);
    } else {
        map.put(str, 1);
    }
}

for (Map.Entry<String, Integer> me : map.entrySet()) {
    String strKey = me.getKey();
    Integer iCount = me.getValue();
    System.out.println(strKey + "出现了" + iCount + "次");
}
  ...


【Algorithm】排序算法 - 选择排序(Selection Sort)

选择排序(Selection Sort)

选择排序的思路是这样的:首先,找到数组中最小的那个元素,其次,将它和数组的第 一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。

这种方法叫做选择排序(Selection Sort),因为它在不断地选择剩余元素之中的最小者。

如下所示,选择排序的内循环只是在比较当前元素与目前已知的最小元素(以及将当前索引加 1 和检查是否代码越界),这已经简单到了极点。交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是 N 。所以算法的时间效率取决于比较的次数。

  ...


【Algorithm】查找算法(Search)- 二分搜索算法(Binary Search)

无处不在的二分思想

二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,我们现在来做一个猜字游戏。我随机写一个 0 到 99 之间的数字,然后你来猜我写的是什么。猜的过程中,你每猜一次,我就会告诉你猜的大了还是小了,直到猜中为止。你来想想,如何快速猜中我写的数字呢?

假设我写的数字是 23,你可以按照下面的步骤来试一试(如果猜测范围的数字有偶数个,中间数有两个,就选择较小的那个)。

7 次就猜出来了,是不是很快?这个例子用的就是二分思想,按照这个思想,即便我让你猜的是 0 到 999 的数字,最多也只要 10 次就能猜中。不信的话,你可以试一试。

这是一个生活中的例子,我们现在回到实际的开发场景中。假设有 1000 条订单数据,已经按照订单金额从小到大排序,每个订单金额都不同,并且最小单位是元。我们现在想知道是否存在金额等于 19 元的订单。如果存在,则返回订单数据,如果不存在则返回 null。

最简单的办法当然是从第一个订单开始,一个一个遍历这 1000 个订单,直到找到金额等于 19 元的订单为止。但这样查找会比较慢,最坏情况下,可能要遍历完这 1000 条记录才能找到。而使用二分查找就能更快速地解决。

  ...


【Security】Wireshake抓包分析HTTPS

抓包1

过滤条件:ssl && ip.addr == 180.101.53.2 && tcp.port == 55583

  ...


【Security】HTTPS

协议历史

SSL(Secure Sockets Layer)协议由Netscape公司开发,历史可以追溯到Netscape Navigator浏览器统治互联网的时代。SSL 1.0 从未发布过,因为存在严重的安全漏洞。

  ...


【Security】安全的 HTTP 的演化

HTTP是什么样的?

HTTP是属于应用层的协议,它是基于TCP/IP的,所以它只是规定一些要传输的内容,以及头部信息,然后通过TCP协议进行传输,依靠IP协议进行寻址,通过一幅最简单的图来描述:

Client发出请求,Server进行响应,就是这么简单。在整个过程中,没有任何加密的东西,所以它是不安全的,中间人可以进行拦截,获取传输和响应的数据,造成数据泄露。

  ...


【Security】密码学(Cryptography)基础

背景

Alice和Bob是谁?

讨论密码学时,我们为了方便起见,通常会使用Alice和Bob这两个名字。他们可以使枯燥的密码学命题变得更加有趣一些。大家公认,Ron Rivest在1977年介绍RSA密码系统的论文中,首次使用了这两个名字。

此后,又有其他一些名字进入了密码学文化。比如,一名具备窃听能力的攻击者叫Eve,一位能妨碍网络流量的主动攻击者叫 Mallory。

  ...


【Network】HTTP协议的演变

HTTP/0.9

最早版本是1991年发布的0.9版。该版本极其简单,只有一个命令GET,也不能包含 Body:

GET /index.html

上面命令表示,TCP 连接(connection)建立后,客户端向服务器请求(request)网页index.html。

协议规定,服务器只能回应HTML格式的字符串,不能回应别的格式:

<html>
  <body>Hello World</body>
</html>

服务器发送完毕,就关闭TCP连接。

  ...