不积跬步无以至千里


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

0024-数据结构-树

发表于 2019-07-31 | 分类于 数据结构

二叉树

定义

二叉树的每个结点至多只有两棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
二叉树的第i(在这里根结点为第一层)层至多有2^(i-1)个结点。
深度为k(根结点深度为1)的二叉树至多有(2^k)-1个结点。

示例

性质

(1) 在二叉树中,第i层的结点总数不超过2^(i-1);
(2) 深度为k的二叉树最多有(2^k)-1个结点,最少有k个结点;
(3) 对任意一棵二叉树,如果其叶子结点数为N0,而度为2的结点总数为N2,那么N0=N2+1;

树的遍历

前序遍历

前序遍历(Pre-Order Traversal)的访问顺序:根节点、左子树、右子树。

前序遍历结果:F, B, A, D, C, E, G, I, H.

中序遍历

中序遍历(In-Order Traversal)的访问顺序:左子树、根节点、右子树。

中序遍历结果:A, B, C, D, E, F, G, H, I.

后序遍历

后序遍历(Post-Order Traversal)的访问顺序:左子树、右子树、根节点。

后序遍历结果:A, C, E, D, B, H, I, G, F.

满二叉树

定义

除叶子结点外的所有结点均有两个子结点,结点数达到最大值,所有叶子结点必须在同一层上。

性质

一棵深度为k的满二叉树具有如下性质:
(1) 叶子结点数为2^(k-1).
(2) 总结点数为(2^k)-1,即总结点数一定是奇数。

完全二叉树

定义

若一个二叉树深度为k,除第k层外,其它各层(1~(k-1)层)的结点数都达到最大个数,且第k层所有的结点都连续集中在最左边,这就是完全二叉树。

性质

完全二叉树除了具备普通二叉树的3种通用性质外还有以下2个特性。
(1) 具有n个结点的完全二叉树的深度为int(log2n)+1
(2) 给定N个结点,能构成h(N)种不同的二叉树
h(N)为卡特兰数的第N项。h(n)=C(n,2*n)/(n+1);

二叉查找树

定义

又称为二叉排序树(Binary Sort Tree)或二叉搜索树。二叉查找树(Binary Search Tree)或者是一棵空树,或者是具有下列性质的二叉树:

(1) 若任意结点的左子树不为空,则左子树上所有结点的值均小于它的根结点的值。

(2) 若任意结点的右子树不为空,则右子树上所有结点的值均大于它的根结点的值。

(3) 任意结点的左、右子树也分别为二叉查找树。

(4) 没有键值相等的结点。

性质

中序遍历一个二叉查找树可以得到一个关键字的有序序列。

平衡二叉树

背景

我们知道,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度O(log2n)同时也由此而决定。但是,在某些极端的情况下(如插入的序列是有序的时候),二叉搜索树将退化成单链表,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,由于在删除时,我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,提高它的操作的时间复杂度。于是就有了我们下边介绍的平衡二叉树。

定义

平滑二叉树(Balanced Binary Tre)也叫AVL(来源于该数据结构的发明者Adelson-Velsky和Landis)树,它要么是一棵空树,要么是具有如下性质的二叉树:
(1) 任意结点的左右子树高度差的绝对值不超过1。

基本概念

平衡因子

某结点的左子树与右子树的高度差即为该结点的平衡因子BF(Balance Factor),在一棵平衡二叉树中,结点的平衡因子取值范围(-1,0,1),分别对应左低右高,左右等高,左高右低。

最小失衡子树

在新插入的结点向上查找,以第一个平衡因子的绝对值超过1的结点为根的子树成为最小不平衡子树。也就是说,一棵失衡的树,是有可能有多棵子树同时失衡的。而这个时候,我们只要调整最小的不平衡子树,就能够将不平衡的树调整为平衡的树。

左旋-右旋

平衡二叉树的失衡调整主要是通过旋转最小失衡子树来实现的。根据旋转的方向有两种处理方式,左旋 与 右旋 。

AVL树

AVL树是最早的自平衡二叉树,相比于后来出现的红黑树而言,它现在应用较少。

定义

一棵AVL树满足以下的条件:

(1) 它的左子树和右子树都是AVL树

(2) 左子树和右子树的高度差不能超过1

AVL 树是高度平衡的,频繁的插入和删除,会引起频繁的reblance,导致效率下降,但它的查找效率较高,适合于插入删除操作较少,查找较多的场景。

红黑树

红黑树(RBT-Red-Black Tree)不是高度平衡的,算是一种折中,插入最多两次旋转,删除最多三次旋转。

B树、B+树、B* 树

B树也是一种用于查找的平衡树,但是它不是二叉树。
B+树是B树的变体,也是一种多路搜索树。
B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针,将结点的最低利用率从1/2提高到2/3。

Trie树

Tire树称为字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。

性质

(1) 根节点不包含字符,除根节点外每一个节点都只包含一个字符;
(2) 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
(3) 每个节点的所有子节点包含的字符都不相同;

应用

(1) 串的快速检索
给出N个单词组成的熟词表,以及一篇全用小写英文书写的文章,请你按最早出现的顺序写出所有不在熟词表中的生词。
在这道题中,我们可以用数组枚举,用哈希,用字典树,先把熟词建一棵树,然后读入文章进行比较,这种方法效率是比较高的。
(2) “串”排序
给定N个互不相同的仅由一个单词构成的英文名,让你将他们按字典序从小到大输出。用字典树进行排序,采用数组的方式创建字典树,这棵树的每个结点的所有儿子很显然地按照其字母大小排序。对这棵树进行先序遍历即可。
(3) 最长公共前缀
对所有串建立字典树,对于两个串的最长公共前缀的长度即他们所在的结点的公共祖先个数,于是,问题就转化为求公共祖先的问题。

0023-树莓派相关

发表于 2019-06-02

1、连接WiFi

(1)将树莓派外接一个显示器(可用HDMI接口),键盘
(2)找到/etc/wpa_supplicant/wpa_supplicant.conf文件,修改其中的WifiID(ssid)及密码(psk)

1
2
3
4
5
6
7
8
9
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="***"
key_mgmt=WPA-PSK
psk="***"
}

(3)重启树莓派
(4)查询获取到的IP,观察wlan0中IP信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
root@raspberrypi:/# ifconfig
eth0 Link encap:Ethernet HWaddr b8:27:eb:XX:XX:XX
inet6 addr: fe80::6d6a:35f5:5f5c:2351/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:203842 errors:0 dropped:0 overruns:0 frame:0
TX packets:203842 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:82362372 (78.5 MiB) TX bytes:82362372 (78.5 MiB)

wlan0 Link encap:Ethernet HWaddr b8:27:eb:XX:XX:XX
inet addr:192.168.XX.XXX Bcast:192.168.31.255 Mask:255.255.255.0
inet6 addr: fe80::ba27:ebff:fecb:d88e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:191486 errors:0 dropped:19 overruns:0 frame:0
TX packets:278266 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:18741736 (17.8 MiB) TX bytes:50965793 (48.6 MiB)

2、samba服务

(1)添加samba用户

smbpasswd -a root
1
sudo smbpasswd -a root

然后输入相应的密码

(2)重启、停止samba服务

1
2
sudo /etc/init.d/samba restart
sudo /etc/init.d/samba stop

3、安装vim编辑器

(1)首先删除默认vi编辑器

1
sudo apt-get remove vim-common

(2)然后重装vim

1
sudo apt-get install vim

(3)优化vim配置
为方便使用,需在/etc/vim/vimrc文件后面添加下面三句

1
2
3
set nu  #显示行号
syntax on #语法高亮
set tabstop=4 #tab退四格

0022-工具技巧

发表于 2019-05-31

1、SecureCRT保存日志

(1) 打开Options->Session Options...,,选择LogFile
(2) Log file name格式

1
%H_%S_%Y%M%D-%h%m%s.log

参数说明:

1
2
3
4
%H---主机IP
%S---Session名
%Y%M%D---年月日
%h%m%s---时分秒

2、VS(Visual Studio)输出重定向到文件

(1)、右键点击解决工程->项目属性

(2)、配置属性->生成事件->生成后事件

在命令行中输入"$(TargetPath) >$(outdir)\1.txt"

(3)、重新编译整个项目,此时就会在debug目录下多了一个1.txt文件,里面就是程序运行时的控制台输出结果。

0021-安全技术

发表于 2019-05-31 | 分类于 安全相关

1、Kali中面向WiFi的工具,像Aircrack-ng、Kismet、以及 Pixie。
2、对于破解密码,它也有像 Hydra、Crunch、Hashcat、以及 John the Ripper 这样的工具。

0020-Linux-samba服务

发表于 2019-05-31 | 分类于 Linux相关

1、查看samba服务状态

1
service smb status

2、启动samba服务

1
service smb start

3、停止samba服务

1
service smb stop

4、samba配置文件

1
/etc/samba/smb.conf

0019_第一个Java程序

发表于 2018-11-07 | 分类于 Java

第一个Java程序

打开Eclipse,依次点击”File”->”New”->”Java Project”,输入Project Name,点击完成

右击工程名,选择”New”->”Class”,输入类名:”HelloWorld”,点击完成,并输入以下代码:

1
2
3
4
5
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
}
}

点击 Run,运行程序,输出如下:

0018_Java开发环境配置

发表于 2018-11-07 | 分类于 Java

下载Java JDK

首先下载Java JDK,根据自己的系统选择对应的版本:

配置环境变量

安装完成后,右击”计算机”->”属性”->”高级系统设置”->”环境变量”
在”系统变量”中设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击”编辑”,不存在则点击”新建”。

  • 变量名:JAVA_HOME
  • 变量取值:C:\Program Files\Java\jdk-11.0.1
  • 变量名:CLASSPATH
  • 变量取值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; //记得前面有个”.”
  • 变量名:Path
  • 变量取值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

测试JDK是否安装成功

1、”开始”->”运行”,键入”cmd”;
2、键入命令: java -version、java、javac 几个命令,出现以下信息,说明环境变量配置成功;

Hexo博客技术

发表于 2018-10-28 | 分类于 博客技术

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

创建一篇新博客

新建博客

1
$ hexo new "My New Post"

More info: Writing

生成静态页面

1
$ hexo generate

More info: Generating

运行Server

1
$ hexo server

在启动Server后,可通过在浏览器中输入http://localhost:4000 ,来预览页面效果。

More info: Server

部署到远端

1
$ hexo deploy

More info: Deployment

gdb调试

发表于 2018-10-27 | 分类于 Linux相关

前言

使用gdb调试前,在编译程序时,要加 -g 选项,否则你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

1
gdb -q a.out // -q(uiet)表示不打印gdb的版权信息

调试环境

运行参数

set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。

环境变量

path

可设定程序的运行路径。
show paths 查看程序的运行路径。
set environment varname [=value] 设置环境变量。如:set env USER=hchen
show environment [varname] 查看环境变量。

工作目录

cd

相当于shell的cd命令。
pwd 显示当前的所在目录。

设置观察点

观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:

1
watch <expr>

为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。[如watch i==100,当该条件成立时程序会暂停执行]

观察某个地址的数据变化 watch (int)0x00000000

分割窗口

layout:用于分割窗口,可以一边查看代码,一边测试:
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
Ctrl + L:刷新窗口

调试过程

开始调试

a. gdb

program也就是你的执行文件,一般在当前目录下。

b. gdb core

用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

列出源码

从第n行开始(编译时要加 -g 选项)

l n

设置断点

1
2
break n //在第n行添加断点
break func //在函数func入口处添加断点

查看断点信息

1
info break

断点命中后自动打印调用栈

1
2
3
4
5
6
7
set pagination off
b malloc
commands 1 (1表示断点编号,用i b可以查询所有断点)
bt
continue
end
c

单步执行

n —>next的首字母

继续执行

c —>continue的首字母

打印变量的值

p varname

查看调用栈

bt

退出函数

finish

退出gdb

q —>quit的首字母

gdb中执行shell命令

shell

grep命令

发表于 2018-10-27 | 分类于 Linux相关

在文件test.txt中查找”hello”关键字以及前后5行的内容

1
grep -C 5 "hello" test.txt

搜索test.txt中含有关键字”hello”的行号

1
grep -n "hello" test.txt

查看test第13-15行

1
sed -n '13,15p' test.txt

统计当前文件夹下目录的个数

1
ls -l|grep "^d"|wc -l

统计文件夹下目录的个数,包括子文件夹里的

1
ls -lR|grep "^d"|wc -l

统计当前文件夹下文件的个数

1
ls -l |grep "^-"|wc -l

统计当前文件夹下文件的个数,包括子文件夹里的

1
ls -lR|grep "^-"|wc -l
123

cgc0415

24 日志
8 分类
20 标签
© 2019 cgc0415
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4