二叉树的遍历采用递归实现是比较简单的一种方式,在实际使用中也常会采用递归实现。但了解如何采用非递归实现,更能加深对二叉树遍历的原理。
非递归的遍历实现,实际会使用到栈的结构。通过对树节点的入栈和出栈,实现二叉树的遍历。
以下为实现代码(Java):
1 | package com.algorithms; |
二叉树的遍历采用递归实现是比较简单的一种方式,在实际使用中也常会采用递归实现。但了解如何采用非递归实现,更能加深对二叉树遍历的原理。
非递归的遍历实现,实际会使用到栈的结构。通过对树节点的入栈和出栈,实现二叉树的遍历。
以下为实现代码(Java):
1 | package com.algorithms; |
不断地选择剩余元素之中的最小者
插入排序所需时间取决于输入中元素的初始顺序。
如名称冒泡一样,比较小的数会逐渐的冒出来。
重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
是为了加快速度简单地改进了插入排序。
核心思想是使数组中任意间隔为h的元素都是有序的。
1 | 例: |
将两个有序的数组归并成一个更大的有序数组,从而使整个数组有序
归并方法
自顶向下的归并排序
自底向上的归并排序
将一个数组分成两个子数组,将两部分独立地排序
在对小数组的快速排序可以切换到插入排序
对快速排序算法的改进,数组中有大量重复数据时表现好
将原先左右两部分换成,大于等于小于三个部分
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。
插入元素:将新元素加到数组末尾,增加堆的大小并让这个新元素上浮到合适的位置
上浮:通过交换节点和它的父节点来实现上浮,如果节点比父节点大,进行交换
1 | private void swim(int k){ |
删除最大元素:从数组顶端删去最大的元素并将数组的最后一个元素放到顶端,减小堆的大小并让这个元素下沉到合适的位置
下沉:将节点向下一段直到它的子节点都比它更小或是到达了堆的底部
1 | private void sink(int k){ |
堆排序就是通过下沉排序完成
堆排序算法:
1 | public static void sort(Comparable[] a){ |
稳定性:如果一个排序算法能够保证数组中重复元素的相对位置则可以被称为是稳定的。
原地排序:基本上不需要借助额外的数据结构就能对输入的数据进行变换的算法。不过,分配少量空间给部分辅助变量是被允许的。算法执行过程中,输入的数据往往会被输出结果覆盖。原地算法只能通过替换或交换元素的方式来修改原始的输入。
算法 | 是否稳定 | 是否为原地排序 | 时间复杂度 | 空间复杂度 | 备注 |
---|---|---|---|---|---|
选择排序 | 否 | 是 | N^2 | 1 | |
插入排序 | 是 | 是 | 介于N和N^2之间 | 1 | 取决于输入元素的排列情况 |
希尔排序 | 否 | 是 | NlogN? N^6/5? |
1 | |
快速排序 | 否 | 是 | NlogN | lgN | |
三向快速排序 | 否 | 是 | 介于N和NlogN之间 | lgN | 运行效率由概率提供保证,同时也取决于输入元素的分布情况 |
归并排序 | 是 | 否 | NlogN | N | |
堆排序 | 否 | 是 | NlogN | 1 |
作为算法的基础,重复多少次阅读都不为过。本文只会挑一些必须记忆或者容易混淆的知识点记录。
整形(int)、双精度实数类型(double)、布尔型(boolean)、字符型(char)
不常用的原始数据类型有:
64位整数(long)、16位整数、8位整数(byte)、32位单精度实数(float)
单精度与双精度浮点数
字符串是由一串字符(char类型的值)组成的。字符串是一个数据类型,但并不是原始数据类型。
字符串在现代编程语言中非常常用,甚至比char基础数据类型还常用,但内心要知道他是由什么实现来的
数组
链表
在我们的后续的算法中,基础的数据结构都离不开这两种基础数据结构。
重新开始审视自己的过去,时间一天一天过去。好像得到了些什么,又好像什么都没有得到。
下午阳光明媚,想着看看之前的生活。好像没办法从记忆中提取。当下大家的记忆可能都在互联网上。看了一下之前自己的微博,觉得那时候的表达欲怎么这么强。记录生活是挺好的一件事情,现在好像都失去了。
可能需要再找回来呢。
网站搭建起来大半年了,一共也没发几篇博客。甚是惭愧。
4月
在技术上:给个简单的计划。或者是阅读个开源库的源码然后,或是记录一些算法,写够10篇技术博客吧。
在生活上:管住嘴,迈开腿。
人总是需要进步的。
最后,人生警句:知善恶,致良知。
通过代码把不符合规范的字符过滤掉
原理为遍历字符串字符,检查字符在utf8中的长度,因为mysql utf8 仅能处理最大3字节的字符
1 | //FilterUtf8SizeGreaterThree mysql数据库utf8只能存储字节3的utf8数据,这里把不符合的字符过滤掉 |
还有一种办法是直接把数据库表或对应字段换成utf8mb4
在处理kubernetes的ci自动滚动更新部署时,会使用到命令:
1 | kubectl apply -f deployment.yaml |
但执行完这条命令后,ci脚本会立即结束,因为kubernetes不会等待部署完成才返回结果。
所有以下脚本可以在执行完滚动更新后,等待执行结果,并在失败时进行回滚,放弃掉这次更新。
1 | kubectl apply -f myapp.yaml |
kubectl rollout status deployment myapp 如果部署失败,此命令会以非零返回码退出,以指示失败。
在工作中,可能会有企业帐号,个人帐号等github帐号需要同时配置ssh key,以便能进行认证并成功拉取代码。本文将介绍如何进行相关配置。
如何生成ssh key 见github指南:https://docs.github.com/cn/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
1 | 生成指定名称ssh key命令: |
在 ~/.ssh 目录下新建一个config文件,添加如下内容(其中Host和HostName填写git服务器的域名,IdentityFile指定私钥的路径)
1 | # github1 |
当然,在本地生成好之后要把ssh加到github帐号SSH配置中,这里不再赘述。
测试命令:
1 | 测试key1:ssh -T [email protected] |
在真实项目中使用:
1 | 例:[email protected]:watermelon-ping/watermelon-ping.github.io.git |
有用的命令:
1 | git remote set-url origin remote-url |
综述:
通过域名别名实现对github的多账户控制
工作中会接触挺多的事情,但做完后不会做一些总结。所以萌发了做一个自己的博客网站的想法。
然后就有了这个网站。
可能不会更新很频繁,但仍希望每月至少有4篇博文会更新到网站上去。
从今天开始吧,会一直保持这个网站的运营。