自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(267)
  • 收藏
  • 关注

原创 3. 基础查找算法——哈希表查找(golang)

哈希表查找根据哈希算法填充数据,然后查找的时候首先计算哈希位置,然后对其位置的数据进行查找。const ( // 数据已经被删除 Deleted = iota // 哈希表的大小 MintableSize = 100 // 已经存在的合法数据 legimate = iota // 数据为空 Empty = iota)// 哈希函数(自定义的,不可靠)func MySHA(str interface{}, tableSize int) int { hashvar :.

2020-11-10 23:05:38 572

原创 2. Golang优先队列(基于堆排序实现)

优先队列既然是优先队列,那么我们首先就需要给数据进行排序,这里最适合的排序方法就是堆排序。排完序以后,就可以从队列里面取出想要的值。// 最大堆、最小堆// 接口实现比大小type Item interface { Less(than Item) bool}type Int intfunc (x Int) Less(than Item) bool { return x < than.(Int)}// 最小堆type Heap struct { // 数据 da.

2020-11-10 22:40:29 1350

原创 1. Golang线程安全(简单例子)

并发导致的问题var money int = 0func add(pint *int) { for i := 0; i < 100000; i++ { *pint++ }}func AddMoney() { for i := 0; i < 1000; i++ { // 这里使用了协程调用,导致多个协程调用同一个资源,产生资源竞争,结果不正确 go add(&money) } time.Sleep(time.Second*5) fmt.Println.

2020-11-10 22:28:56 1440

原创 2. 基础查找算法——三分查找法(golang)

三分查找法三分查找法的核心思想关键词:两个枢轴三分查找法和二分查找法相比,只是多了一个枢轴。代码实现func ThirdSearch(arr []int, data int) int { low := 0 high := len(arr) - 1 i := 0 //循环的终止条件 for low <= high { i++ fmt.Println("第", i, "次") // 初始化枢轴 mid1 := low + int((high-low)/3).

2020-11-10 21:41:39 564

原创 12. 进阶排序算法——木桶排序(golang)

木桶排序木桶排序的核心思想关键词:分桶将数组分到有限数量的桶子里,每个桶子再个别排序。其实木桶排序和基数排序很相似,区别在于基数排序需要多趟桶排序,并且记录当前排序的结果。代码实现// 获取数组最大值func SelectSortMax(arr []int) (max int, err error) { // 数组长度 length := len(arr) // 空数组 if length == 0 { //err = errors.New("空数组") retu.

2020-11-10 21:37:03 415

原创 11. 进阶排序算法——地精排序(golang)

地精排序地精排序的核心思想关键词: 冒泡、插入地精排序适合大部分数据为有序 的情况,在数据有序时不做交换,在数据乱序时先进行冒泡排序,然后再进行插入排序。func GnomeSort(arr []int) []int { i := 1 for i < len(arr) { if arr[i] >= arr[i-1] { // 符合顺序,继续前进 i++ } else { // 不符合顺序,交换 arr[i], arr[i-1] = arr[i.

2020-11-09 23:37:26 164

原创 2. 基础查找算法——插值查找(golang)

插值查找插值查找的核心思想关键词: 插值在前面的二分查找法里,中间值是简单的(low+high) / 2。假设你在英文字典查找单词apple,你会怎么查呢?很显然你不会从中间开始查找,而是有目的地往前或者往后去翻。也就是说,枢轴不应该是绝对的中间值,而是应该根据查找值与最大最小值的关系去确认枢轴。插值公式:mid := (low + high) / 2mid = low + (high - low) * 1/2假设data位于中间值与high之间,则:mid = low + (h.

2020-11-09 22:59:26 354

原创 1. 基础查找算法——二分查找法(golang)

二分查找法二分查找法的核心思想关键词: 等分首先需要对数据进行排序,然后将数据进行等分,接着对比中间值来判断数据处于哪个区间,不停地进行缩小范围查找数据。代码实现func BinarySearch(arr []int, data int) int { low := 0 high := len(arr) - 1 i := 0 //循环的终止条件 for low <= high { i++ fmt.Println("第", i, "次") // 初始化枢轴 m.

2020-11-08 18:55:27 431

原创 9. 进阶排序算法——鸡尾酒排序(golang)

鸡尾酒排序鸡尾酒排序核心思想关键词: 正向、反向、排序鸡尾酒其实就是循环,正向、反向分别做冒泡排序。代码实现func CocktailSort(arr []int) []int { // 数组长度 length := len(arr) if length <= 1 { return arr } // 遍历 for i := 0; i < length-1; i++ { flag := false // 正向冒泡 if i%2 == 0 { .

2020-11-08 16:44:41 152

原创 8. 进阶排序算法——基数排序(golang)

基数排序基数排序核心思想关键词: 分级分别对个位数、十位数、百位数…上面的数字分级排序。举个例子:3、38、11、659、162先按照个位数排序,变成11、162、3、38、659。再按照十位数排序,变成3、11、38、659、162。最后按照百分数排序,变成3、11、38、162、659。代码实现func RadixSort(arr []int) []int { // 最大值,确定数量级 max, _ := selectSort.SelectSortMax(arr) /.

2020-11-08 16:31:36 425

原创 7. 进阶排序算法——奇偶排序(golang)

奇偶排序奇偶排序的思想核心关键词:奇数 、偶数、冒泡奇偶排序其实就是循环,将奇数、偶数分别做冒泡排序。代码实现func OddEvenSort(arr []int) []int { length := len(arr) // 标记 isSorted := false for isSorted == false { isSorted = true // 从奇数位开始交换 for i := 1; i < length-1; i = i + 2 { if .

2020-11-08 15:26:39 255

原创 6. 进阶排序算法——归并排序(golang)

归并排序归并排序的思想核心关键词:分组、合并首先将很长的序列进行分组,然后对其进行排序,然后将相邻的分组合并…如此重复,直至得到一个有序序列。递归版本代码实现func MergeSort(arr []int) []int { // 数组长度 length := len(arr) // 数组为空或者数组只有一个元素 if length <= 1 { retu...

2020-04-03 17:12:23 252

原创 5. 进阶排序算法——堆排序(golang)

前言由于博主目前还没有系统学习到二叉树相关的知识,所以有关完全二叉树的概念尽量不会提到。下文会尝试用最最简单,最容易理解的方式进行描述。堆排序的思想核心前面提到的基础排序算法,他们都有一个缺点,没有把每一次的比较结果保存下来,这就导致了后续会进行重复的比较工作。工作流程:构建一个堆的结构;找到堆内最大或者最小值,将其移走;剩余的元素又组成一个新的堆。循环往复...

2020-04-03 15:06:02 246

原创 4. 进阶排序算法——希尔排序(golang)

希尔排序前言插入排序在某些情况下,效率是很高的。比如我们的记录本身就是基本有序的,只需要少量的插入操作。再比如,记录少的时候,插入排序效率的优势也是很明显的。可是现实中,哪有那么理想的情况啊[>_<]没有环境,那我们就要自己创造啊!!!基本有序:所谓的基本有序就是小的关键字在前面,大的基本在后面,不大不小的基本在中间。希尔排序的思想核心关键词: 步长、分...

2020-04-03 11:54:38 451

原创 3. 基础排序算法——插入排序(golang)

插入排序插入排序的基本操作就是将一个记录插入到有效表中。代码实现package insertSortfunc InsertSort(arr []int) []int { // 数组长度 length := len(arr) // 数组为空或者数组只有一个元素 if length <= 1 { return arr } for i := 1; i < ...

2020-04-03 00:58:52 177

原创 2. 基础排序算法——选择排序(golang)

选择排序和冒泡排序相比,选择排序先是通过和比较,从而找到最小值的索引,最后进行交换。重复上述过程,最后便能得到有序的数组。代码实现func SelectSort(arr []int) []int { // 数组长度 length := len(arr) // 数组为空或者只有一个元素 if length <= 1 { return arr } // 遍历,比...

2020-04-03 00:43:42 142

原创 1. 基础排序算法——冒泡排序(golang)

冒泡排序冒泡排序是一种交换排序,它的基本思想是相邻的元素进行比较交换。代码实现package bubbleSortimport ( "errors" "fmt")// 冒泡排序找最大func BubbleFindMax(arr []int) (max int, err error) { // 数组长度 length := len(arr) // 空数组 if ...

2020-04-03 00:30:26 168

原创 《大话数据结构》学习笔记 —— 05 队列(golang实现)

队列定义队列是一种先进先出(First in first out, FIFO)的线性表,它只允许在一端进行插入操作,而在另一端进行删除操作。允许插入的一端,称为队尾。允许删除的一端,称为队头。队列的顺序存储结构基本上和线性表的顺序存储结构一致。入队示意图:出队示意图:代码实现package Queue// 队列的接口type MyQueue interfa...

2020-04-02 23:38:11 129

原创 《大话数据结构》学习笔记 —— 04 栈(golang实现)

栈定义栈是一个后进先出的(Last in first out, LIFO)的线性表,它限定仅在表尾进行删除和插入操作。关键词栈顶、栈底允许插入和删除的一端称为栈顶,另一端称为栈底。空栈不包含任何数据元素的栈称为空栈。栈的插入操作栈的插入操作,叫作进栈,也称压栈、入栈。栈的删除操作栈的删除操作,叫作出栈,也称弹栈。栈的顺序存储结构进栈操作示意图:代码...

2020-04-01 09:44:36 198

原创 《大话数据结构》学习笔记 —— 03 双向链表(golang实现)

循环链表定义双向链表是在单链表的每个结点中,再设置一个指向前驱结点的指针域、代码实现package DoubleLinkling// 双向链表结点type DoubleLinkNode struct { value interface{} // 上一个结点 prev *DoubleLinkNode // 下一个结点 next *DoubleLinkNode}...

2020-04-01 08:19:10 122

原创 《大话数据结构》学习笔记 —— 03 线性表之循环链表(golang实现)

循环链表前言普通的单链表有一个明显的缺点,如果不从头结点出发,就无法访问到全部结点。定义将单链表中终端结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。...

2020-04-01 08:15:29 158

原创 《大话数据结构》学习笔记 —— 03 线性表之单链表(golang实现)

单链表定义如果链表中的每个结点只包含一个指针,则该链表称为单链表。单链表结构如图所示:代码实现package mainimport ( "errors" "fmt")// 定义单链表结点结构体type Node struct { // 数据 Data int // 指针 Next *Node}// 获取链表中的第i个元素func (head *No...

2020-04-01 08:15:03 177

原创 《大话数据结构》学习笔记 —— 03 线性表(golang实现)

线性表定义线性表:零个或多个数据元素的有限序列。序列元素之间是有顺序,若存在多个元素,则第一个元素无前驱元素,最后一个元素无后继元素,每个元素有且仅有一个前驱和后继元素。而且元素类型也相同!有限线性表强调表里的元素有限。长度线性表元素的个数n(n≥0)定义为线性表的长度,当n=0时,称为空表。线性表的顺序存储结构定义线性表的顺序存储结构:用一段地址连续的存...

2020-04-01 08:14:36 220

原创 《大话数据结构》学习笔记 —— 02 算法

基本概念算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。为了解决某个或某类问题,需要把指令表示成一定的操作序列,操作序列包括一组操作,每一个操作都完成特定的功能,这就是算法。特性算法具有五个基本特性:输入、输出、有穷性、确定性和可行性。输入输出算法具有零个或多个输入,并且至少有一个输出。绝大多数情况下,算法都需要输入参数,但如...

2020-03-26 00:00:47 202

转载 《大话数据结构》学习笔记 —— 01 数据结构

一、基本概念1. 数据结构 + 算法 = 程序程序设计的实质是对确定问题选择一种好的结构,加上设计一种好的算法。2. 数据定义可描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。特性可以输入到计算机中。能够被计算机程序处理。对于整数、浮点数等数值型类型,可以直接进行数值计算。对于字符数据,需要进行非数值的处理。譬...

2019-05-25 18:10:34 171

转载 操作系统基础——09 同步互斥

背景独立进程&并发进程进程并发执行的好处进程并发执行出现异常的例子再来看看程序实际运行的情况由于在程序运行的时候进行了上下文切换,进程一保存的Reg1是100,所以最后进程一next_pid是101。进程二也是一样,获取到的next_pid也是101。原子操作为了解决上面可能出现的异常问题,我们需要原子操作。临界区进程中访问临界资源的一段需要互斥执...

2019-04-29 17:55:19 130

转载 操作系统基础——08 线程

背景概念线程是进程的一部分,描述指令流执行状态。它是进程中的指令执行流的最小单元,是CPU调度的基本单位。单线程&多线程线程&进程...

2019-04-29 15:30:28 113

转载 操作系统基础——07 进程

概念组成特点进程和程序联系区别进程控制块使用组成组织方式生命周期进程创建进程运行进程等待进程抢占进程唤醒进程结束状态变化模型挂起进程模型...

2019-04-29 15:04:02 101

转载 操作系统基础——06 虚拟内存

产生原因程序规模的增长速度远远大于存储器容量的增长速度。理想中的存储器:更大、更快、更便宜的非易失性存储器。实际中的存储器:地址空间:如果内存不够用怎么办?...

2019-04-29 14:27:01 84

转载 操作系统基础——05 非连续内存分配

背景段式存储管理程序的分段地址空间分段寻址方案分段可以实现更好的分离和共享数据。物理地址和逻辑地址的关系如下图:可以看出来,逻辑地址是连续的,但物理地址是非连续的。再来看一下,一些相关的概念。寻址过程如下图所示:页式存储管理分页地址空间页寻址方案分页也类似于分段,有页号和页的偏移量。它们主要的区别是,分段里的偏移量是可变的,而分页...

2019-04-24 17:51:47 133

转载 操作系统基础——04 连续内存分配与碎片整理

概述分区的动态分配什么时候需要提供连续空间的分配?当一个程序准许运行在内存中时,需要分配给程序一个连续区间;当运行的程序需要访问数据时,需要给数据分配一个连续区间。动态分区的分配策略最先分配(First-fit)最优分配(Best-fit)最差分配(Worst-fit)最先分配为了分配N字节,使用第一个比N字节大的空闲块。譬如现在我们需要分配400...

2019-04-24 16:58:16 431

转载 操作系统基础——03 内存

内存分层体系操作系统内存管理内存分为2类,一个是物理内存,一个是逻辑内存。一般一个程序的逻辑内存是连续的,物理内存是非连续的。逻辑内存可以比物理内存大。常用的内存管理方式:重定位分段分页虚拟内存...

2019-04-24 16:33:51 107

转载 操作系统基础——02 启动、中断、异常、系统调用

启动BIOS将Bootloader从硬盘的引导扇区加载到内存中去,然后Bootloader会将OS和数据从硬盘加载到内存中,跳转到OS的起始地址,此后CPU被OS接管。中断、异常、系统调用中断硬件设置中断标记【CPU初始化】将内部、外部事件设置中断标记中断事件的ID软件(操作系统)保存当前处理状态中断服务程序处理清除中断标记恢复之前保存的处...

2019-04-24 16:08:31 98

转载 操作系统基础——01 概述

定义:1. 操作系统是一个控制程序一个系统软件控制程序执行过程,防止错误和计算机的不当使用执行用户程序,给用户程序提供各种服务方便用户使用计算机系统2. 操作系统是一个资源管理器应用程序与硬件之间的中间层管理各种计算机软硬件资源提供访问计算机软件硬件资源的高效手段解决资源访问冲突,确保资源公平使用地位组成Kernael(内核)组成C...

2019-04-24 15:34:58 140

原创 Redis基础——02 订阅发布

简介Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。订阅频道PSUBSCRIBE pattern [pattern ...]function f($redis, $chan, $msg) { switch($chan) { case 'chan-1': ... ...

2019-02-27 17:10:47 141

原创 Redis基础——01基本数据类型(string、Hash、List、Set、sorted set)

1. Stringset: 赋值 set key value $redis-&gt;set('key','value')setex: 赋值(带过期时间,单位s) setex key expire value $redis-&gt;setex('key','expire','value')setnx: key不存在才能赋值 setnx ke...

2019-02-27 15:59:46 313

转载 Swoole进阶——04 进程(消息队列通信)

使用步骤1. 创建子进程对象// 普通形式$process = new swoole_process('callback_function', false, false);// oop形式swoole_process::__construct(callable $function, $redirect_stdin_stdout = false, $create_pipe = fal...

2019-02-14 22:24:46 670

转载 Swoole进阶——03 协程

介绍再次理解异步传统的PHP采用同步阻塞的形式,譬如一个程序需要获取redis和mysql里面的数据,那么执行过程时间是redis + mysql。如果采用异步的形式,那么时间将是max(redis, mysql)。协程的作用应用层可使用完全同步的编程方式,底层自动实现异步IO。也就是说,你写的时候是同步的形式,但是程序执行的时候是异步的。协程Redis基于Server、H...

2019-02-14 21:08:07 472

转载 Swoole进阶——02 内存之Table

介绍swoole_table一个基于共享内存和锁实现的超高性能,并发数据结构。用于解决多进程/多线程数据共享和同步加锁问题。Swoole的Memory模块其实都是用于进程之间的通信,不同进程可以通过Memory模块共享数据。使用步骤1. 创建内存表对象swoole_table-&gt;__construct(int $size, float $conflict_proportio...

2019-02-14 20:26:47 780

转载 Swoole进阶——01 进程(管道通信)

定义进程就是正在运行的程序的一个实例。例如,我们在某个终端去执行一个php脚本,这个时候就可以认为是开启了一个进程。基本使用1. 创建一个子进程对象// 普通形式$process = new swoole_process('callback_function', true);// oop形式swoole_process::__construct(callable $func...

2019-02-14 17:47:42 684

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除