5.24-7.2

相关算法

判断两颗二叉树相等

有两种方法:一种是递归比较。另一种是二叉树的遍历。

先说二叉树的遍历。由于先序遍历 再加上 中序遍历能唯一确定一棵二叉树。故,对这两棵树分别进行先序和中序遍历,比较这两棵树的先序遍历序列和中序遍历序列,如果都一样则说明这两棵二叉树是一样的。这里用了两次遍历。时间复杂度为O(2N)

首先比较根结点是不是一样的;如果根结点一样,再继续比较根的左右孩子是不是一样的,这是一个递归过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct BinaryNode {
char data;
} struct BinaryTree {
int data;
BinaryNode *lc;
BinaryNode *rc;
} bool isEqual(BinaryTree A, BinaryTree B) {
if (A == NULL && B == NULL)
return true;
if (!A || !B)
return false;
if (A->data == T2 -> data)
return isEqual(A->lc, B->lc) && isEqual(A -> rc, B -> rc)
else
return false;
}

判断二叉树是另一颗二叉树子结构 pointer or value

个人感觉判断子结构要比判断子树困难一点,如果是子树,那么它一定是子结构;但是反过来不成立。

判断子结构的核心思路其实与 (1) 中判断两棵树是否相同 是一致的。只不过对于 (1) 而言, 只要有一个结点不相同了,那这二棵二叉树就不是一样的了。而对于子结构而言,有可能某个结点的子树中包含了 子结构。

首先遍历二叉树A的根结点8,由于二叉树B的根为4,两者不同。此时我们可以判断出这两棵树是不相同的。

但是,我们还不能判断出二叉树B 不是 二叉树A 的子结构。还需要进一步判断。这个判断,就是一个递归过程了。递归如下:

判断二叉树A的根结点的左子树是否包含了二叉树B,若未包含,再判断二叉树A的根结点的右子树是否包含了二叉树B

从前面的 (2) 可知,我们可以用判断子结构的实现,来判断子树。

若二叉树B是二叉树A的子结构,且二叉树A的根结点 与 二叉树B的根结点不相同。那么,二叉树B就是二叉树A的子树了。

故这种方法的时间复杂度也为O(NK)

此外,还有另外一种方法:可将该问题转化为串的匹配问题。如果二叉树是B是二叉树A的子树,

则二叉树B的中序遍历序列 (前序、后序应该也是可以的吧)是 二叉树A的 中序遍历 序列的一个子串。

从而,可以用KMP算法实现字符串匹配。如果匹配成功,则说明二叉树B是二叉树A的子树,反之则不是。

DP算法

https://blog.csdn.net/u010900754/article/details/55015018

https://blog.csdn.net/cr496352127/article/details/77934132?locationNum=10&fps=1

字符串匹配 算法

朴素匹配算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int navie_string_matcher(char *T, char *P)
{
lenOri = strlen(T)
lenMod = strlen(P) for i = 0;i<lenOri;i++ {
for j = 0;j<lenMod;j++ {
if P[j] != T[i+j] 匹配位数 是一样同步的
break // 如果不匹配 则 跳出 offset ++
if j = lenMod - 1 // 匹配完毕
return s;
}
}
}

Rabin-Karp 算法

以 十进制 数 来表示字符串 算法匹配中更加方便。

给定一个模式串P[1-m],同理在文本串T[s+1..s+m]表示文本串中某段与模式串长度相等的一串字符,那么分别用数字p,t表示这两个字符串,通过比较数字p和t的大小,就可确定字符串是否匹配而无需用模式串中字符依次匹配文本串。

也就 是 直接比较 数字 防止额外的 依次遍历

也可以用于字符串分类?

数学中有霍纳法则,我们运用霍纳法则在O(m)内计算p:

p=P[m]+10(P[m-1]+10(P[m-2]+…+10(P[2]+10P1)…)))

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "stdio.h"
#include "string.h"
#include "math.h" char* substr(char* p, int start, int end)
{
char *q = malloc(sizeof(char)*(end-start+1))
int i = 0;
for(;i<end-start+1;i++) {
*(q+i) = *(p+start+i)
}
return q;
} void Rabin_karp_matcher(char T[], char P[], int d, int q)
{
n = strlen(T)
m = strlen(P)
h = ((int)pow(d, m-1))
p=0
t=0
for(i=0;i<m;i++) {
p=(d*p+P[i]-'a')%q;//求p
t =(d*t +T[i]-'a')%q;
t0=(d*t0 +T[i]-'a');//求初始t0=num(T[1,m])
}
int s;
for(s=0;s<=n-m;s++)
{
if(p==t&&(strcmp(P,substr(T,s,s+m-1))==0))
// if(p==t)
{ printf("%d\n",s);
} printf("%d %d %c \n",t,p,T[s]);
int tem=t0;
t0=(d*(tem-(T[s]-'a')*h)+T[s+m]-'a');//求ts+1;
t=t0%q;
// int tem=t;
// t=(d*(tem-(T[s]-'a')*h)+T[s+m]-'a')%q; }
} int main()
{ char T[100], P[100];
scanf("%s",T);
scanf("%s",P);
RABIN_KARP_MATCHER(T,P,10,13); return 0;
}

有限自动机

https://blog.csdn.net/u011467044/article/details/55008649

KMP

在模式P匹配文本T时,当匹配到最后一位不匹配时,朴素字符串匹配的做法是P往前移动一位继续匹配

可是根据我们的观察发现更有效的做法是P可以直接往前移动两位

如上个人理解PI数组主要记录当前匹配无效时下次的有效偏移位数,避免无效的偏移。
KMP算法充分利用已匹配的信息,避免重复的匹配过程。

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include<stdio.h>
#include<string.h>
#define MAX_LEN 20
int PI[MAX_LEN]; void Compute_prefix_fun(char P[])
{
int m,k,q;
m=strlen(P);
PI[0]=0;
k=0;
for(q=1;q<m;++q)
{
while((k>0)&&P[k]!=P[q])
{
//q=PI[q];
k=PI[k];
}
if(P[k]==P[q])
k=k+1; PI[q]=k;
} }
void KMP_matcher(char T[],char P[])
{
int n,m,q,i;
n=strlen(T);
m=strlen(P);
Compute_prefix_fun(P);
q=0;
for(i=0;i<n;i++)
{
while((q>0)&&P[q]!=T[i])
{
q=PI[q-1];
}
if(P[q]==T[i])
q=q+1;
if(q==m)
{
printf("%d\n",i-m+1);
q=PI[q-1];
} } }
int main()
{ char T[20],P[20];
scanf("%s",T);
scanf("%s",P);
KMP_matcher(T,P);
return 0;
}

PHP

常量 PHP_SAPI 判断当前运行模式

1
2
3
4
if (PHP_SAPI == "cli" // "cgi") {
//
}

Throwable 是PHP7以上才有的 涵盖更多 Exception 选项

PHP 从 MySQL 查出来的 可能 会多 \r\n 的字符 不符合 可以去掉

str_replace

call_user_func_array

对 函数 不定参数 函数 可以进行解构操作 方便使用

Linux

pstree 查看 当前进程树

可以通过 pstree 看到当前进程树

如何 构建磁盘满的状态?

首先将 dev/ramX 挂在一个目录 这个目录的可写入大小大概为100M左右

dd if=/dev/zero of=sun.txt bs=5000000M count=10

就充满了这个分区

例如 PHP file_put_content 默认 存储 会导致 报错

fswatch (MAC) inotifyWait (linux)

文件监控

1
inotifywait -e modify -e create -e move --format '%T %w%f %Xe %e ' -m --exclude .tmp$ --exclude '^*.[0-9a-zA-Z]{6}$'  -r --timefmt '%a %b %d %T %Y'  /data1/ms/template /data1/ms/template.test /data1/ms/resource

远程运维工具 SaltStack

Golang

Go cmd.exec 执行目录问题

rsync的时候 为了创建 新文件夹在target上,需要R参数,但是必须cd 到指定目录

go的执行shell命令是不可以直接cd的

通过

1
2
cmd := exec.Command("ls")
cmd.Dir="/"

即可

Go for 启动闭包函数携程带来的坑

原代码

1
2
3
4
5
6
for i,checker := range k.checkers {
go func () {
checker(k)
}()
}

结果发现 range 并且启动了之后 启动的都是同一个checker

修改代码后发现

1
2
3
4
5
6
for i,checker := range k.checkers {
go func (checker Checker) {
checker(k)
}(checker)
}

运行了正常的checkers

得知 go 在开启携程时 遇到 for 并不会立即开启携程 会在for range 之后开启 因此 需要 在go func 内部进行传参 保证每次启动的闭包函数正确

Go 多协程读写 Map 会报错

map不是线程(goroutine)安全的。

增加 Sync.Mutex 互斥所 或者 RWMutex 读写锁 可以解决问题

对于 hashMap的更新问题

如果 多线程在访问hashMap

可以 read dirty save 三个

写入的 dirty

读取的时候 如果 dirty 有 则读dirty 并且写入read

如果扩容的时候 读read

然后 底层 扩容 然后 进行read dirty 综合判断后复制

time.Duration

话说这个 感觉 Go 真的 是画蛇添足了

time.sleep(time.Duration(k.sleep_time) * time.second)

真的是 冗长的代码

Go 的fswatch库

官方不支持 -r 的递归监控 放弃吧 inotify + fswatch

defer

defer 会 在函数return 之前 执行 用于 一些句柄 等资源的回收 但是 会造成性能的削减

Go 运行时内存堆栈分析

参考备忘录 Markdown 传不上来

GTX log 6的更多相关文章

  1. (转)深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080+CUDA8.0

      深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080+CUDA8.0 发表于2016年07月15号由52nlp 接上文<深度学习主机攒机小记>,这台GTX10 ...

  2. [ZZ] GTX 280 GPU architecture

    http://anandtech.com/show/2549 Now that NVIDIA’s has announced its newest GPU architecture (the GeFo ...

  3. 深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow

    接上文<深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080+CUDA8.0>,我们继续来安装 TensorFlow,使其支持GeForce GTX 1080显卡 ...

  4. 基于Ubuntu16.04的GeForce GTX 1080驱动安装,遇到的问题及对应的解决方法

    1.在主机上插上GPU之后,查看设备: $ nvidia-smi Tue Dec :: +------------------------------------------------------- ...

  5. Ubuntu16.04+GTX 1080Ti+CUDA 8.0+cuDNN+Tesnorflow1.0深度学习服务器安装之路

    0.安装背景 系统:ubuntu 16.04 内核:4.4.0-140-generic GPU:GTX 1080Ti nvidia驱动版本: 384.111 cuda: CUDA 8.0 深度学习库c ...

  6. gnome/KDE安装,gnome出现问题,重新安装nvdia驱动, Linux(CentOS7) NVIDIA GeForece GTX 745 显卡驱动

    新安装显示gtx745驱动NVIDIA-Linux-x86_64-346.59.run, yum groupremove kde-desktop yum groupinstall "Desk ...

  7. 如何正确使用日志Log

    title: 如何正确使用日志Log date: 2015-01-08 12:54:46 categories: [Python] tags: [Python,log] --- 文章首发地址:http ...

  8. UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件

    在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...

  9. const let,console.log('a',a)跟console.log('a'+a)的区别

    const 创建一个只读的常量 let块级作用域 const let重复赋值都会报错 console.log('a',a) a console.log('a'+a) a2 逗号的值会有空格:用加号的值 ...

随机推荐

  1. React Native项目集成iOS原生模块

    今天学习一下怎么在React Native项目中集成iOS原生模块,道理和在iOS原生项目中集成React Native模块类似.他们的界面跳转靠的都是iOS原生的UINavigationContro ...

  2. 当超强台风“山竹”即将冲进南海,Power BI 你怎么看?

    这个周末“山竹 ”强势来袭!很多人的目光都在关注暴力水果“山竹”,这个号称70年最强最大风力超17级 台风“山竹”今天就已经在小悦家窗台肆虐咆哮了一天了!不知其他的小伙伴们是不是好好的一个周末就只能被 ...

  3. Java基础(2)面向对象和封装,对象的创建和使用、java对象的内存图

    1 类和对象 类:是一类事物的描述,抽象的.猫 对象:是一类事物的实例,具体的.某只猫 2 类的定义 成员变量和成员方法 //定义一个学生类 public class Student { //成员变量 ...

  4. Unescaped left brace in regex is illegal here in regex; marked by <-- HERE in m/\${ <-- HERE ([^ \t=:+{}]+)}/ at xxxx/usr/bin/automake line 3939.

    /********************************************************************** * Unescaped left brace in re ...

  5. Ubuntu端口命令---查看端口占用及关闭

    Ubuntu查看端口使用情况,使用netstat命令: 查看已经连接的服务端口(ESTABLISHED) netstat -a 查看所有的服务端口(LISTEN,ESTABLISHED) netsta ...

  6. mvc core2.1 Identity.EntityFramework Core 导航状态栏(六)

    之前做的无法 登录退出,和状态,加入主页导航栏 Views ->Shared->_Layout.cshtml <div class="navbar-collapse col ...

  7. 实验吧—密码学——WP之 困在栅栏里的凯撒

    首先我们研究题目.栅栏:凯撒 还发现一个数字“6”,那么我们很容易就有一个解题思路 对这段字符进行栅栏解密再进行凯撒解密 我们都知道,栅栏解密的关键就是栏数,根据题目中我们发现的信息,这段字符串是12 ...

  8. 【mybatis源码学习】mybtias知识点

    Mybatis技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用Mybatis的文章,所以,一些参数使用细节略掉了,我们的目标是介绍 ...

  9. 【idea】清除类中无用的包

    快捷键 ctrl+alt+o 自动清除的配置方法 可以settings-general-auto import-java项,勾选optimize imports on the fly,在当前项目下会自 ...

  10. MongoDB的真正性能-实战百万用户

    阅读目录 一.第一个问题:Key-Value数据库可以有好多的Key,没错,但对MongoDB来说,大错特错 二.第二个问题:FindOne({_id:xxx})就快么? 三.第三个问题:精细的使用U ...