Jialong's Blog

Do things I love, and seek happiness.

0%

初级排序算法

选择排序

算法描述

首先找到数组中最小的一个元素,将其与数组的第一个元素进行交换;再在剩余的元素找到最小的一个元素,将其与数组的第二个元素进行交换。如此循环往复,直到将整个数字排序。

代码实现

1
public class Selection {
2
    public static void sort(Comparable[] a)
3
    {
4
        //将a按照升序排列
5
        int N = a.length;
6
        for (int i = 0; i < N; i++)
7
        {
8
            int min = i;
9
            for (int j = i + 1; j < N; j++)
10
            {
11
                if (less(a[j], a[min]))
12
                    min = j;
13
            }
14
            exch(a, i ,min);
15
        }
16
    }
17
}

性能分析

  • 对长度为$N$的数组,选择排序大概需要$N^2/2$次比较和$N$次交换。
  • 该算法运行时间与输入无关,数据的移动是最少的。
阅读全文 »

算数表达式

这里的算术表达式支持常见的二元运算符+-*/以及接受一个参数的平方根运算符sqrt。这里我们假定表达式中未省略所有的括号。

计算方法

  • 将操作数压入操作数栈
  • 将运算符压入运算符栈
  • 忽略左括号
  • 遇到右括号时,弹出一个运算符,弹出需要数量的操作数进行运算,然后将得到的结果再压入操作数栈。

代码实现

1
package edu.princeton.cs.algs4;
2
3
public class Evaluate {
4
	public static void main(String[] args)
5
	{
6
		Stack<String> ops = new Stack<String>();
7
		Stack<Double> vals = new Stack<Double>();
8
		while (!StdIn.isEmpty())
9
		{
10
			//读取字符,如果是运算符则压入运算符栈ops
11
			String s = StdIn.readString();
12
			if (s.equals("("));
13
			else if (s.equals("+"))    ops.push(s);
14
			else if (s.equals("-"))    ops.push(s);
15
			else if (s.equals("*"))    ops.push(s);
16
			else if (s.equals("/"))    ops.push(s);
17
			else if (s.equals("sqrt"))    ops.push(s);
18
			
19
			//如果字符为),则弹出运算符和操作数,计算结果并压入操作数栈vals
20
			else if (s.equals(")"))
21
			{
22
				String op = ops.pop();
23
				double v = vals.pop();
24
				if (op.equals("+"))    v = vals.pop() + v;
25
				else if (op.equals("-"))    v = vals.pop() - v;
26
				else if (op.equals("*"))    v = vals.pop() * v;
27
				else if (op.equals("/"))    v = vals.pop() / v;
28
				else if (op.equals("sqrt"))    v = Math.sqrt(v);
29
				
30
				vals.push(v);
31
			}
32
			//如果字符既非运算符又非括号,将其作为double值压入操作数栈vals
33
			else vals.push(Double.parseDouble(s));
34
		}
35
		StdOut.println(vals.pop());
36
	}
37
}

3.1 概述和运输层服务

运输层协议在不同主机上的应用进程之间提供了逻辑通信,这并非物理上的实际通信。在发送端,运输层将从应用程序接收到的报文转换成运输层分组,该分组称为运输层报文段,实现方法是将应用报文划分为一个个小的块,为每个块加上运输层首部生成运输层报文段,然后在端系统中传递给网络层,网络层将其封装成网络层分组,向目的地发送。

因特网由TCP和UDP两种运输层协议。

3.1.1 运输层和网络层的关系

网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。

运输层协议至工作在端系统中,同时网络中的路由器既不处理也不识别运输层加在应用层报文的任何信息。运输层协议能提供的服务常常受制于底层网络层协议,例如,如果网络层协议无法为主机之间发送的运输层报文段提供时延和带宽保证,运输层协议可就无法为进程之间发送的应用程序报文提供时延和带宽保证。

3.1.2 运输层概述

首先定义两个名词的意义:

  • 报文段:运输层分组,即TCP和UDP的分组
  • 数据报:网络层分组

网络层的IP被称为不可靠服务。

阅读全文 »

1. SSL/TLS简介

TLSTransport Layer Security,传输层安全协议),以及它的前身SSLSecure Sockets Layer,安全套接层)是一种安全协议。Netscape公司在1994年推出HTTPS协议,使用SSL进行加密,这是SSL的起源。1999年公布了第一版的TLS协议,类似于SLLv3,只是对其做出了一些更改。

SSL协议处在计算机网络中的应用层和运输层之间,它不依赖于平台和运行程序的协议。

几个知名的使用SSL加密的协议

HTTP over SSL (HTTPS)

简称为HTTPS,它的产生是为了加密网页,HTTP是第一个使用SSL保障安全的应用层协议。HTTPS在RFC2818被标准化,HTTPS工作在443端口,HTTP默认工作在80端口。

Email over SSL

类似于HTTP over SSL,协议如下:

  • SMTP、IMAP能够支持SSL
  • SMTP over TLS在标准文档RFC2487中
阅读全文 »

0. 前言

最近在写笔记文档和实验报告的时候遇到一些处理资料图片的问题,PDF电子书或文档中的插图一般为矢量图,自己写笔记如果需要引用这些插图时,一般会直接截图,截图为JEPG或PNG格式,并非矢量图,会在新的文档中出现失真。所以为了解决这个问题,我使用Adobe Acrobatinkscape两个软件将PDF中的矢量图导出为SVG格式的矢量图。以下为具体步骤:

1. 在Adobe Acrobat中选择编辑PDF选项

阅读全文 »

0.前言

第一次使用Tex语言完整地完成了一篇实验报告的构建排版,这过程中遇到了各种各样的问题,有些问题虽然解决了,但在原理方面还是一知半解,之后再遇到还希望能多看文档。这篇博客是来记录第一次编写过程中遇到的一些问题。

这是第一次实验报告导出的pdf文档封面展示:

这是tex源代码

阅读全文 »

1.3 指数信号与正弦信号

1.3.1 连续时间复指数信号与正弦信号

连续时间复指数信号有如下形式:

实指数信号

上式中的$C$和$a$都为实数的信号。

周期复指数信号和正弦信号

第二种重要的信号为将上式$a$限制为纯虚数的信号(复指数信号):

当基波周期$T_0 = \left| \frac {2\pi} {w_0} \right|$时,该信号是周期信号。

阅读全文 »

理解本文的基础是公钥密码加密,即非对称加密,比如其中一种非对称加密算法RSA。

非对称加密使用一对密钥,一个为公钥Pub,另一个为私钥Priv

明文P经过公钥Pub使用RSA加密算法混淆后变成了密文M,密文M无法用公钥Pub解开,只能用私钥Priv解开

同样的,明文P经过私钥Priv使用RSA加密算法混淆后变成了密文N,密文N只能用公钥Pub解开

阅读全文 »

转眼间2019年就要结束了,依稀记得2019年的刚开始我还在发空间动态说自己又买了一本日历,然而…明年就不买了吧,我并没有记得经常去看日历,更别说去每天一张一张地撕它。这一年里经历了非常多的事情,从学习、生活、关于未来的各方各面,我都发生了极大的改变,这源于我不断变化的想法,目标总是飘忽不定,我思考过,也经常迷茫,现在也是。

在写下这些话的时间里,我其实是非常难过和害怕的,这一个周末似乎没干什么事情就又要浑浑噩噩地结束了,直到现在还有一个DDL等着我,明早截止,我还没做完,间歇性拖延症晚期这件事情,一直发生在我身上,毫不夸张地说,我可以不间歇地拖延整整24小时,这过程中总想着做些什么、改变些什么,但除了睡觉,大部分时间眼睛都盯在手机屏幕上,尽管我知道这样做一点儿也不好,但结果还是发生了。我知道学习的重要性,也会去为了一个想要实现的东西不断地思考并找到解决方法,就比如搭建网站这件事情,前前后后花了很多的时间也学习了很多相关知识,基本掌握了中间的原理,结果在我预想的时间之前很久就做出来了,结果还是超乎预期的好。说实话,完成一件能看的到结果的事情能给人的心理带来很大的快感的愉悦,但愉悦过后,又只剩下了迷茫和拖延,并且在为了找到下一个实践目标而苦苦挣扎着。有时候大脑盯着手机屏幕看一些信息的时候,知道这是自己不想接收和浪费时间的,但就是控制不住自己去点开看,这样的人性的弱点也造就了很多的商机,造就了很多企业和公司的成功。

说点儿别的。在关于情感和人际交往方面,我可能是一个与绝大多数人都不一样的人,在情感上,我很少与他人或者是在公开场合表露(包括我的社交媒体,我发现,自己现在很少在社交媒体上表露自己的情感,更多的是分享一些自己的兴趣爱好,比如我热爱的摄影,因而,我也就把自己的空间对所有人开放了,微信这个东西另当别论,说实话,我挺讨厌这个软件的),但我还是知道自己想要的是什么,纵然我在过去的一年里总是带着一些自卑的情感,很久没有与他人进行深入内心的交谈,KY的与陌生人打电话活动也错过了很多次,每次都是在想和别人深入交流的时候才想起来,结果肯定是已经结束了,今后还是要多多关注,想想能与一同关注KY的人打电话是一件挺幸福的事情,也希望自己能早日找到灵魂伴侣。在人际交往方面,我尝试过学校的很多社团和活动,最终无一例外全都放弃了,我觉得也挺好,这也证明了我确实不喜欢过多的浮于表面和拉帮结派建造复杂人际关系的事情,做好自己就最好了,能认识几个朋友还是随缘了,人也并不需要那么多看上去像是朋友的朋友。

扯了这么多,还是回到最重要的学习和事业上吧。12月希望自己能好好学习学校的课程知识,好好地应对一下考试。明年下半年就要大三了,这学期结束以后要为成为一个前端工程师立一些目标,毕竟就快要毕业了,还是希望自己能去做自己喜欢的工作,上研究生这件事就暂时不考虑了,我在经历了一些事情以后对于读研这件事一点儿也不感兴趣了,做好自己就好了。

以上。