Go语言中文网 为您找到相关结果 412

程序员修仙之路--突破内存限制的高性能排序

菜菜的涨工资申请还在待审批中.... 作为一个技术人员,技术的问题还是要解决。经过线上日志的分析,日志采用小时机制,一个小时一个日志文件,同一个小时的日志文件有多个,也就是说同一时间内的日志有可能分散在多个日志文件中,这也是Y总要合并的主要原因。每个日志文件大约有500M,大约有100个。此时,如果你阅读到此文章,该怎么做呢?不如先静心想2分钟!! 问题分析 要想实现Y总的需求其实还是有几个难点的: 如何能把所有的日志文件按照时间排序 日志文件的总大小为500M*100 ,大约50G,所以全部加载到内存是不可能的 程序执行过程中,要频繁排序并查找最小元素。 那我们该怎么做呢?其中一个解决方案就是它:堆 解决方案 堆定义 堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个...阅读全文

Golang 的内存管理(上篇)

Golang 的内存管理基于 tcmalloc,可以说起点挺高的。但是 Golang 在实现的时候还做了很多优化,我们下面通过源码来看一下 Golang 的内存管理实现。下面的源码分析基于 go1.8rc3。1.tcmalloc 介绍关于 tcmalloc 可以参考这篇文章 tcmalloc 介绍,原始论文可以参考 TCMalloc : Thread-Caching Malloc。2. Golang 内存管理下面的源码分析基于 go1.8rc3。0. 准备知识这里先简单介绍一下 Golang 运行调度。在 Golang 里面有三个基本的概念:G, M, P。G: Goroutine 执行的上下文环境。M: 操作系统线程。P: Processer。进程调度的关键,调度器,也可以认为约等于 CP...阅读全文

博文 2017-09-02 07:30:04 zhangboyu

Go:内存管理分配

![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191103-Go-Memory-Management-and-Allocation/cover.png) ℹ️ *这篇文章基于 Go 1.13。* 在内存从分配到回收的生命周期中,内存不再被使用的时候,标准库会自动执行 Go 的内存管理。虽然开发者不必操心这些细节,但是 Go 语言所做的底层管理经过了很好的优化,同时有很多有趣的概念。 ## 堆...阅读全文

leetcode 142 环形链表的环的第一个节点

题目描述 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 说明:不允许修改给定的链表。 进阶: 你能否不使用额外空间解决此题? 解题思路 无环链表,最后一个节点为nil,有环链表可以无限循环next下去 不用额外空间:快慢节点,慢节点一次走一步,快节点一次走两步,当进入环中,每次循环,快节点会离慢节点近一步,快节点最终会追上慢节点 用额外空间: 用map存走过的节点,第一个走过的节点就是环的入口 不用额外空间 环形链表 设:链表头是X,环的第一个节点是Y,slow和fast第一次的交点是Z。各段的长度分别是a,b,c,如图所示 第一次相遇时slow走过的距离:a+b,fast走过的距离:a+b+c+b 因为fast的速度是slow的两倍,所以fast走的距离是...阅读全文

博文 2018-10-26 19:34:40 TomorrowWu

golang container包List和Ring

container/list  这个包包含了两个公开的程序实体:List和Element。前者实现了一个双向链表(以下简称链表),而后者则代表了链表中元素的结构。 //这是一个list中存储的元素 type Element struct { // Next and previous pointers in the doubly-linked list of elements. // To simplify the implementation, internally a list l is implemented // as a ring, such that &l.root is both the next element of the last // list element (l.Ba...阅读全文

博文 2018-09-27 00:34:39 one_zheng

leetcode 24 两两交换链表中的节点

题目描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 说明: 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 代码实现 // ListNode Definition for singly-linked list. type ListNode struct { Val int Next *ListNode } func swapPairs(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } var prev *ListNode cur := head h...阅读全文

博文 2018-10-26 12:34:38 tomorrowwu

架构师知识体系整理

抽空系统整理一下知识体系.仅仅作为一个纲要.1. 计算机基础1.1 CPUCPU指令流水线CPU多级缓存CPU缓存失效CPU 缓存一致性协议CPU MUMA架构多核CPU的演进CPU分支预测1.2 内存内存访问主内存工作内存虚拟内存页表/TLBMMAP内核page cache内核block cache进程地址空间内核地址空间1.3 磁盘机械磁盘/SSD/NVME ...顺序读写/随机读写内核 cache/预读cache脏页flush磁盘cachefsync/datasync/sync原子读写MMAPMMAP读写性能分析磁盘IO1.4 文件 本地文件远程文件虚拟文件系统卷MMA以及异常软链接/硬链接文件句柄/资源1.5 网络IO多路复用TCPHTTP/HTTPS代理带宽1.6 容器隔离CPU/...阅读全文

博文 2019-12-17 18:32:45 贺大伟

程序员修仙之路-数据结构之 CXO让我做一个计算器!

CXO的需求果然还在继续,深呼吸,深呼吸 ....... 有人说数据结构是为算法服务的,我还要在加一句:数据结构和算法都是为业务服务的!! CXO的需求果然不同凡响,又让菜菜想到了新的数据结构:栈 栈的特性 定义 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 栈作为一种数据结构,其中有几个特性需要提起大家注意: 操作受限:何为操作受限?在栈的操作中,一般语言中针对栈的操作只有两种:入栈和出栈。并且操作只发生在栈的顶部...阅读全文

轻松学习区块链2 - 简单区块链的实现

## MiniBC区块链V001 - 简单区块链的实现 # #### 区块 我们从“区块链”的“区块”部分开始。区块是区块链中最基本的数据结构,在区块链中,区块存储了有价值信息。例如,比特币区块存储了交易数据,除此之外,区块中还包含其它信息:版本号,当前时间和前一个块的哈希值等。我们把bitcoin的区块定义稍作简化,作为MiniBC的区块定义: type Block struct { Version int32 //协议版本号 HashPrevBlock []byte //上一个区块的hash值,长度为32个字节 Time int32 //时间戳,从1970.01.01 00:00:00到当前时间的秒数 Bits int32 //工作量证明(POW)的难度 Nonce int32 //要找...阅读全文

博文 2019-05-19 23:11:07 wangshizebin

golang 多维哈希(map,hashmap)使用心得

有些场景使用多维哈希来存储数据,很简单粗暴好用。这里记录一下。 如下是三维哈希的简单示意图,建议层数不要太多,否则时间久了,自己写的代码都不认识。 下图是三维哈希在内存的存储形式,hashmap嵌套了3层。图里一层数组存放hashcode和链表头节点指针,每个节点里面都存放一个数组,数组存放下一层hashcode和下一层链表指针。(抱歉没有将哈希分桶链表完整画出来,本图重点是哈希嵌套) 这个数据结构我是用来解析保存不同设备的配置,每个设备有两个配置文件。当新来一个该设备的数据(base64加密后的json序列化字符串),通过这个三维哈希层层解析,返回给用户直观的表象。这里不谈业务,只谈如何暴力存,暴力解。 /******************************************...阅读全文

博文 2018-08-29 18:30:00 brave-xin

Redis常用五大数据类型

1.String(字符串) string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M 2.Hash(哈希) Redis hash 是一个键值对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 类似Java里面的Map 3.List(列表) Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。 它的底层实际是个链表 4.Set(集合) Redis...阅读全文

造轮子 | golang | 支持过期时间的LRU缓存

本文代码已上传github,欢迎交流。 最近在学习go语言,正好有遇到需要使用缓存的地方,于是决定自己造个轮子。主要特性如下: 线程安全; 支持被动触发的过期时间; 支持key和value任意类型; 基于双向链表和hash表实现; 双向链表的插入、删除和元素移动效率非常高,LRU缓存通常都有大量的以上操作。使用hash表来存储每个key对应的元素的指针,避免每次查询缓存都需要遍历整个链表,提高效率。 被动的过期的时间表示并不会主动的删除缓存中已经过期的元素,而是在需要使用的时候才去检查是否过期,如果过期的话再去删除。 数据结构 每个缓存的元素至少包含两个:缓存的关键字key、缓存的数据data;为了支持过期时间,每个元素还要有一个值来表示其过期时间;另外基于双向链表实现,还需要指向前一个元素...阅读全文

博文 2019-04-18 01:34:41 yiekue

Golang标准库深入 - 双向链表(container/list)

1. 什么是双向链表 (引用) 和单链表比较,双向链表的元素不但知道自己的下线,还知道自己的上线(越来越像传销组织了)。小煤车开起来,图里面可以看出,每个车厢除了一个指向后面车厢的箭头外,还有一个指向前面车厢的箭头(车头、车尾除外)。车头只有指向后面车厢的箭头,车尾只有指向前面车厢的箭头。 2. 和单向链表相比的优势 1. 插入删除不需要移动元素外,可以原地插入删除 2. 可以双向遍历 插入数据到中间 删除中间数据 3、双向链表与Go的对应结构 1.节点分析 我们先把车厢分解开来。每节车厢都由煤炭、车体、拉前车厢绳索、拉后车厢绳索这4部分组成。车体是我们的运输工具,在Go语言里我们用结构提DNode表示;煤炭代表运的货物,用data变量表示;拉前车厢绳索和拉后车厢绳索我们分别用指针prev和...阅读全文

博文 2018-05-16 11:33:06 90design

Goroutine源码记录

上一篇博客总结了Go调度器的设计以及go调度器解决如何解决了用户态线程典型问题,这一篇就跟踪下Goroutine的源码实现。Go1.5源码剖析 已经写的非常详细了,我只把我觉得重要的地方集中总结一下。 Go程序初始化过程C程序的入口地址通常是C运行库的_start函数,它完成了初始化堆栈、命令行参数设置、环境变量初始化、IO初始化、线程相关初始化或者还有全局构造。Go的入口函数整个初始化过程也完成了类似的工作。 123runtime.args // 整理命令行参数 设置环境变量runtime.osinit // 确定CPU的core数目 调整procs的值runtime.schedinit // 初始化栈 内存分配器 垃圾回收器和并发调度器 初始化过程之后进入了runtime.main。这时...阅读全文

博文 2017-12-21 06:28:34 nino's blog

LeetCode算法系列.0023_合并K个排序链表

0023_合并K个排序链表 题目描述 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 算法 type ListNode struct { Val int Next *ListNode } func mergeKLists(lists []*ListNode) *ListNode { n := len(lists) switch n { case 0: return nil case 1: return lists[0] case 2: //针对两个链表进行归并排序 return merge(lists[0], lists[1]) default:...阅读全文

博文 2018-09-07 19:34:39 tomorrowwu

HashMap原理和实现

理我们都知道怎么使用goLang中的map来存储键值对类型的数据,但是它的内部实现是怎么样的?其实map是一种HashMap,表面上看它只有键值对结构,实际上在存储键值对的过程中涉及到了数组和链表。HashMap之所以高效,是因为其结合了顺序存储(数组)和链式存储(链表)两种存储结构。数组是HashMap的主干,在数组下有有一个类型为链表的元素。这是一个简单的HashMap的结构图: HashMap结构当我们存储一个键值对时,HashMap会首先通过一个哈希函数将key转换为数组下标,真正的key-value是存储在该数组对应的链表里。HashMap的数组往往是有限的,那当要存储的键值对很多数组不够或者两个键值对哈希运算后的值相同时,不就会有不同的键值对存储在同一个数组下吗?是的,这个就叫做...阅读全文

博文 2018-07-11 14:34:45 Java小铺

golang中container/list包用法

list是一个双向链表。该结构具有链表的所有功能。 type Element type Element struct { Value interface{} //在元素中存储的值 } func (e *Element) Next() *Element //返回该元素的下一个元素,如果没有下一个元素则返回nil func (e *Element) Prev() *Element//返回该元素的前一个元素,如果没有前一个元素则返回nil。 type List func New() *List //返回一个初始化的list func (l *List) Back() *Element //获取list l的最后一个元素 func (l *List) Front() *Element //获取lis...阅读全文

博文 2016-10-14 08:00:07 u011686226

DockOne技术分享(二十六):Docker Registry V1 to V2

【编者的话】Docker Registry 2.0版本在安全性和性能上做了诸多优化,并重新设计了镜像的存储的格式。我们将详细介绍Docker Registry V1与V2的区别,并在此基础上分享了灵雀云的实时同步迁移实践。 1. 相关概念首先讲一下Registry相关的概念。大家对Docker应该比较了解了,就是容器技术使用了Cgroups、Namespaces、Union FS等一系列机制来保证隔离。但我们实际使用中可能并不会直接接触这些技术,更直接使用的是pull image、run image,再进阶一点会使用build image和push image。我们日常的使用主要还是围绕image展开的。 而image和Registry的关系可以想象成自己机器上的源码和远端SVN或者Git服...阅读全文

博文 2017-06-25 15:01:18 oilbeater

Learn Golang List

Learn Golang List 简介 list标准包contain中的双向链表 常见操作 初始化 插入 删除 例子 package main import "fmt" import "container/list" func main() { fmt.Println("init list") l := list.New() //插入 l.PushBack("tail") fmt.Println(l) //头部添加 l.PushFront("head") fmt.Println(l) // 遍历 for i := l.Front(); i != nil; i = i.Next() { fmt.Println(i.Value) } } 如何查看帮助 终端运行godoc -http=:8080...阅读全文

博文 2019-02-13 04:34:43 笑吧小鸟

Golang Map 实现 (四) map的赋值和扩容

golang map 操作,是map 实现中较复杂的逻辑。因为当赋值时,为了减少hash 冲突链的长度过长问题,会做map 的扩容以及数据的迁移。而map 的扩容以及数据的迁移也是关注的重点。 数据结构 首先,我们需要重新学习下map实现的数据结构: type hmap struct { count int flags uint8 B uint8 noverflow uint16 hash0 uint32 buckets unsafe.Pointer oldbuckets unsafe.Pointer nevacuate uintptr extra *mapextra } type mapextra struct { overflow *[]*bmap oldoverflow *[]*bma...阅读全文

博文 2020-04-30 10:32:41 搬砖程序员带你飞

链表(Linked List)

什么是链表? 通过指针或者引用将一系列数据节点串起来的数据结构称为链表,链表数据结构与数组最明显的区别就是它在内存中并不是连续的,链表是通过在每个数据节点中设置下一个节点的指针Next将下一个节点串起来 为什么会有链表? 每一个编程语言中都会有数组的数据结构,可以直接通过索引下标来访问数组中的数据,所以对于数组来说访问一个值的时间复杂度为O(1)。但是如果要在数组中插入一个值时会有哪些情况呢 1、需要在数组的头插入 对于这种情况需要将数组中所有的元素往后挪动一步,然后再将待插入的数据插入第一个空间 2、需要在数组中间插入 其实这种情况跟第一种情况是一样的,只不过往后挪动的数据不是所有数据,只需要挪动待插入节点后面的数据 3、在数组的后面插入 这种情况最简单,只需要将待插入节点插入的最后即可 ...阅读全文

比特币核心概念及算法

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 bitcoin项目地址位于github仓库,当前各种“币”,基本都是从抄写bitcoin代码开始起步的。想要深度研究,从看源码开始不可避免。 P2P:电骡、迅雷、BT,在中国网络影视的发展让大家对P2P很熟悉,可能已经没有人记得比特币实际上是第一批P2P的实践者。所有交易记录在全网通过P2P的方式广播,每个人都保存一份完整的交易记录。所以也叫去中心化。 去中心化:bitcoin的去中心化是指的账本去中心化,每个人都拥有完整的交易记录。因此不会出现人为修改某一个账本就导致财产丢失的情况。 在这种模式下,想有效的修改以前的交易记录,就需要有工作量证明(POW)。理论上修改之前的区块必须做到51%的联网机器都认可才可能...阅读全文

博文 2019-09-18 16:32:42 链客

golang 链表

golang 链表 简介 golang自身实现了一个双向链表 导入 import "container/list" 定义 // 链表元素 type Element func (e *Element) Next() *Element func (e *Element) Prev() *Element //链表 type List func New() *List func (l *List) Back() *Element func (l *List) Front() *Element func (l *List) Init() *List func (l *List) InsertAfter(v interface{}, mark *Element) *Element func (l *Li...阅读全文

博文 2018-08-30 11:35:22 haoguo

想了解阿里云CDN产品介绍及使用入门,还不快点进了

课程介绍 通过CDN,可以将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点播、直播等场景。 本课程主要讲解阿里云CDN产品的使用方法。 课时列表 • 课时1:创建CDN并添加域名 • 课时2:利用工具合并CDN日志操作 • 课时3:通过资源监控定位CDN域名当前情况 • 课时4:CDN产品介绍 • 课时5:CDN的安全防护 • 课时6:CDN的页面优化、GZIP和range回源 • 课时7:CDN的HTTP头含义 • 课时8:CDN配置回源host及自定义404页面 • 课时9:CDN设置防盗链及使用鉴权功能 ...阅读全文

golang rpc源码问题记录

源码位置 net/rpc/server.go 数据结构 // Server represents an RPC Server. type Server struct { serviceMap sync.Map // map[string]*service reqLock sync.Mutex // protects freeReq freeReq *Request respLock sync.Mutex // protects freeResp freeResp *Response } // 成员函数 func (server *Server)freeRequest(req *Request) func (server *Server)getRequest() *Request { serv...阅读全文

博文 2018-09-06 19:34:39 xikaka

单向循环链表解决约瑟夫环问题 - Golang 实现

问题描述 编号为 1, 2, … , n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m ,从第一个人开始按顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 的值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止。 基本要求 利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 测试数据 7 个人的密码依次为:3, 1, 7, 2, 4, 8, 4 ;m 值为 6 (正确的出列顺序应为 6, 1, 4, 7, 2, 3, 5)。 开始 单个结构体的实现 定义指针和结构体 package main import "fmt" // 定义结构体 typ...阅读全文

博文 2019-09-19 18:32:41 孟显赫

链表表示数字相加 go语言版本

链表表示数字相加 go语言版本给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807package main import "fmt" import "strconv" import "reflect" type ListNode struct { data int next *ListNode } //转成字符串,数字 相加,再转成链表 func AddTwoNum(l1 *ListNode, l2 *ListNode) *ListNode ...阅读全文

博文 2019-10-14 22:03:22 雷顿学院

12 Go语言map底层浅析

Go语言map底层浅析 [TOC] 笼统的来说,go的map底层是一个hash表,通过键值对进行映射。 键通过哈希函数生成哈希值,然后go底层的map数据结构就存储相应的hash值,进行索引,最终是在底层使用的数组存储key,和value。稍微详细的说,就设计到go map 的结构。hmap 和bmap。 1、Hash函数 哈希表就不得不说hash函数。hash函数,有加密型和非加密型。加密型的一般用于加密数据、数字摘要等,典型代表就是md5、sha1、sha256、aes256这种;非加密型的一般就是查找。在map的应用场景中,用的是查找。选择hash函数主要考察的是两点:性能、碰撞概率。golang使用的hash算法根据硬件选择,如果cpu支持aes,那么使用aes hash,否则使用m...阅读全文

博文 2019-03-04 16:34:44 杨旭

Go语言开发(十四)、Go语言常用标准库四

Go语言开发(十四)、Go语言常用标准库四 一、heap 1、heap简介 heap仅仅提供了最小堆的操作,没有提供堆的数据结构,堆的数据结构必须由开发者自己实现。heap提供了一个heap.Interface接口来作为堆的操作和堆的数据结构(开发者自己实现)之间的桥梁,堆的数据结构必须满足此接口: type Interface interface { sort.Interface Push(x interface{}) // add x as element Len() Pop() interface{} // remove and return element Len() - 1. } sort.Interface定义在sort.go中: type Interface interface...阅读全文

博文 2019-01-17 02:35:14 天山老妖S

Golang 写一个链表遍历的时候为什么是死循环?

type LinkNode struct { data int next *LinkNode } func reverseNode(node *LinkNode) { if node == nil { return } result := list.New() for i := node; i != nil; i = node.next { fmt.Println(i.data) result.PushFront(i.data) } //反向遍历 for v := result.Back(); v != nil; v = v.Prev() { fmt.Println(v.Value) } } func ma...阅读全文

Go转型——数据结构初级(三)

**1**.链式线性表 从之前的例题来看,线性表的顺序存储结构如果需要插入和删除i(1<=i<=n)元素,需要移动大量元素,所以我们可以看一下线性表另一种表示方式——链式存储结构。它不要求逻辑上相邻的元素物理位置也相邻,因此,链式存储结构没有顺序线性表的缺点,同样,它也失去了顺序线性表可随机存储的优点。 线性链表的特点是,使用一组任意的存储单元存储线性表的数据元素(遮住存储单元可以是连续的,也可以是不连续的),因此为了表示数据元素a(i)和其直接后继元素a(i+1)之间的逻辑关系,对于数据元素a(i)来说,除了要保存自身存储的数据信息,还需要存储一个指示其直接后继的信息(即直接后继的存储位置),这两部分结合起来组成数据元素a(i)的存储映像,称为**结点**。它包含两个域,其中,包含自身存储...阅读全文

博文 2018-01-23 11:14:31 yinshidaoshi

链表以及golang介入式链表的实现

链表以及golang介入式链表的实现 今天看tcp/ip协议栈的代码时看到一个双向链表,链表吗?听过它的顶顶大名,知道它是由节点构成的,每个节点还有个指针指向下一个节点,但是从来没自己实现过一个,没有实践就不能深刻理解,遂有此文。 以下所有观点都是个人愚见,有不同建议或补充的的欢迎emial我aboutme 何为链表? 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。 简单的说...阅读全文

博文 2018-01-16 13:44:31 sheepbao.github.io

两数相加

题目: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 解题思路: 链表遍历,最后结果返回头 两个链表不一定等长 考虑进位 Java实现 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN...阅读全文

博文 2019-06-17 14:02:42 杨比轩

哈希表哪家强?哈希表华山论剑,几大编程语言吵起来了!

哈希表华山论剑 比特宇宙编程语言联合委员会准备举办一次大会,主题为哈希表,给各大编程语言帝国都发去了邀请函。 哈希表哪家强?哈希表华山论剑,几大编程语言吵起来了! 很快就到了大会这一天 联合委员会秘书长开场发言:“诸位,为促进技术交流与发展,增强各帝国友谊,联合委员会特设此盛会,感谢诸位的捧场” 会场传来一阵鼓掌声······ 哈希表哪家强?哈希表华山论剑,几大编程语言吵起来了! 秘书长继续发言:“本次大会的主题是哈希表,人类程序员使用最多的数据容器之一,各大编程语言帝国相信都有实现。今天的大会就围绕哈希表分为几个议题讨论,首先是第一个议题:存储结构与冲突解决” 存储结构与冲突解决 来自GoLang帝国的map率先发言:“哈希表,哈希表,首先得是个表嘛,所以最基本的要用一个数组来存储,数组中...阅读全文

博文 2020-04-27 19:32:57 java梦想口服液

利用单向环形链表解决约瑟夫问题

## **利用单向环形链表解决约瑟夫问题** **** **一开始我是想用list来解决的,但我想了很久都想不出来,只能用自定义的单向环形链表解决了。** **基本思路: 略!!** :smile: **直接上代码吧** ```golang //单向环形链表解决约瑟夫问题 package main import "fmt" //创建一个带自身指针的结构体 type node struct { no int next *node } //创建两个标记变量,head标记第一个结点,tail标记最后一个结点 var head, tail *node //追加结点 func addNode(n *node) { if tail == nil { head = n n.next = head tail...阅读全文

博文 2018-12-03 15:25:52 joker_zai

Golang GC

内存分区 代码经过预处理、编译、汇编、链接4步后⽣成⼀个可执⾏程序。 在 Windows 下,程序是⼀个普通的可执⾏⽂件,以下列出⼀个⼆进制可执⾏⽂件的基本情况: PS D:\Soft\GoCode\src> size .\01.exe text data bss dec hex filename 1440107 81844 0 1521951 17391f .\01.exe 由上可以得知,在没有运⾏程序前,也就是说程序没有加载到内存前,可执⾏程序内部已经 分好三段信息,分别为代码区(text)、数据区(data)和未初始化数据区(bss)3 个部分。 有些⼈直接把data和bss合起来叫做静态区或全局区 代码区 存放 CPU 执⾏的机器指令。通常代码区是可共享的(即另外的执⾏程序可以调⽤它...阅读全文

博文 2020-05-21 19:33:17 强某某

Go语言并发与并行学习笔记(三)

以下设计模式和应用场景来自Google IO上的关于Goroutine的PPT:https://talks.golang.org/2012/concurrency.slide 本文的示例代码在: https://github.com/hit9/Go-patterns-with-channel 生成器 在Python中我们可以使用yield关键字来让一个函数成为生成器,在Go中我们可以使用信道来制造生成器(一种lazy load类似的东西)。 当然我们的信道并不是简单的做阻塞主线的功能来使用的哦。 下面是一个制作自增整数生成器的例子,直到主线向信道索要数据,我们才添加数据到信道 func xrange() chan int{ // xrange用来生成自增的整数 var ch chan int...阅读全文

Golang数据结构 - 3 - 队列

队列 在上一章中我们学习了栈以及栈的基本操作,并使用数组切片和链表来实现了两种不同的栈操作方式,接下来我们将学习并实现队列。 队列与栈非常相似,但是元素的出入原则与栈不同,在栈中元素是以后进先出(LIFO)的原则进行的,而在队列中元素以先进先出(FIFO)的原则进行。 队列与栈类似,是一种特殊的线性表,它只允许在表的前端进行插入操作,也只允许在表的后端进行弹出操作。进行插入操作的一端称为队尾,而进行删除操作的一端则称为队头。 本章将基于Go数组切片、链表来实现队列的基本操作,同时实现双端队列,最终探讨循环队列的特性以及应用。 队列定义 首先对队列定义如下基本操作接口: Enqueue(e ...Element):添加若干元素入队 Dequeue() Element:队首元素出队 Peek()...阅读全文

博文 2019-06-19 23:32:46 monigo

Go语言单链表

package main import "fmt" type Node struct { data int next *Node } func Shownode(p *Node){ //遍历 for p != nil{ fmt.Println(*p) p=p.next //移动指针 } } func main() { var head = new(Node) head.data = 0 var tail *Node tail = head //tail用于记录最末尾的结点的地址,刚开始tail的的指针指向头结点 for i :=1 ;i<10;i++{ var node = Node{data:i} (*tail).next = &node tail = &node } Shownode(h...阅读全文

博文 2019-12-25 21:33:13 huang_he_87

leetcode 142 环形链表的环的第一个节点

题目描述 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 说明:不允许修改给定的链表。进阶: 你能否不使用额外空间解决此题? 解题思路 无环链表,最后一个节点为nil,有环链表可以无限循环next下去 不用额外空间:快慢节点,慢节点一次走一步,快节点一次走两步,当进入环中,每次循环,快节点会离慢节点近一步,快节点最终会追上慢节点 用额外空间: 用map存走过的节点,第一个走过的节点就是环的入口 不用额外空间 设:链表头是X,环的第一个节点是Y,slow和fast第一次的交点是Z。各段的长度分别是a,b,c,如图所示 第一次相遇时slow走过的距离:a+b,fast走过的距离:a+b+c+b 因为fast的速度是slow的两倍,所以fast走的距离是slow的两...阅读全文

博文 2018-10-26 19:34:38 tomorrowwu

golang源码学习之defer

数据结构 //runtime/runtime2.go type _defer struct { siz int32 //参数大小 started bool // defer是否被调用过的标识 sp uintptr // sp at time of defer pc uintptr fn *funcval // defer 后面跟的function _panic *_panic // panic that is running defer link *_defer // 链表结构 } 每一个defer关键字在编译阶段都会转换成deferproc,编译器会在函数return之前插入deferreturn。 deferproc //runtime/panic.go // 创建一个defer, fn...阅读全文

博文 2019-07-22 19:32:41 ihornet

现代缓存设计-续集

这是 Benjamin Manes 的讲座文章,他曾在谷歌担任工程师,现在正在 Vector 担任 CTO 职务。 [前一篇文章](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html)描述了 [Caffeine](https://github.com/ben-manes/caffeine) 使用的缓存算法,特别是淘汰算法和并发模型。我们还对淘汰算法进行了改进,并探索了一种新的到期方法。 ## 淘汰策略 [Window TinyLFU(W-TinyLFU)](https://dl.acm.org/citation.cfm?id=3149371)算法将策略分为三部分:准入窗口、频率滤波器和主区域。通过使用...阅读全文

博文 2019-10-15 12:01:36 polaris

链表中环的入口结点

题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 思路 可以使用快慢指针的思想,来判断链表中是否有环,快指针每次走两步,慢指针每次走一步,若快指针走到了空节点便是无环,若快慢指针相遇,便有环。 假设环形链表的起点到环形入口的距离为a,环形链表的入口到快慢指针的相遇点的距离为b,相遇点到环形链表的入口的距离为c,具体详情看下图。 我们可以通过公式推导出,当两个指针相遇之后,一个指针移到头部,一个指针在相遇点继续走,每次走一个单位;二者最终可以在链表入口相遇;具体公式如下: -1. 2 (a+b) = a + k(b+c) + c -2. ** a = (k-1)(b+c) + c** -3. 其中k大于等于1,而b+c为一圈,所以这两个指针肯定会在入口相遇 ...阅读全文

博文 2020-03-14 21:32:45 youzhihua

带你领略Go源码的魅力----Go内存原理详解

1、内存分区 代码经过预处理、编译、汇编、链接4步后生成一个可执行程序。 在 Windows 下,程序是一个普通的可执行文件,以下列出一个二进制可执行文件的基本情况: 通过上图可以得知,在没有运行程序前,也就是说程序没有加载到内存前,可执行程序内部已经分好三段信息,分别为代码区(text)、**数据区(data)和未初始化数据区(bss)**3 个部分。 有些人直接把data和bss合起来叫做静态区或全局区。 1、1 代码区(text) 存放 CPU 执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。...阅读全文

博文 2019-11-27 00:04:24 练识

责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析

本文来自网易云社区作者:乔安然1. Chain of Responsiblity定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。结构实图:2. Netty ChannelPipeline 分析Netty的ChannelPipeline和ChannelHandler机制类似于Servlet和Filter过滤器,这类过滤器其实就是责任链模式的一种变形,方便事件的拦截和用户业务逻辑的定制且相互不必耦合在一起。Netty将Channel的数据管道抽象为ChannelPipeline,消息在ChannelPipline中流动和传递。ChannelPipeline持有IO事件拦截器ChannelHand...阅读全文

博文 2018-09-18 09:34:46 网易云社区

数据结构和算法(Golang实现)(17)常见数据结构-树

树 树是一种比较高级的基础数据结构,由n个有限节点组成的具有层次关系的集合。 树的定义: 有节点间的层次关系,分为父节点和子节点。 有唯一一个根节点,该根节点没有父节点。 除了根节点,每个节点有且只有一个父节点。 每一个节点本身以及它的后代也是一棵树,是一个递归的结构。 没有后代的节点称为叶子节点,没有节点的树称为空树。 二叉树:每个节点最多只有两个儿子节点的树。 满二叉树:叶子节点与叶子节点之间的高度差为0的二叉树,即整颗树是满的,树呈满三角形结构。在国外的定义,非叶子节点儿子都是满的树就是满二叉树。我们以国内为准。 完全二叉树:叶子节点与叶子节点之间高度差不会超过1的二叉树,即一个节点的左右子树的高度不会超过一层,也称平衡二叉树。 树根据儿子节点的多寡,有二叉树,三叉树,四叉树等,我们这...阅读全文

golang刷LeetCode[0002] 两数相加

题目 https://github.com/betterfor/leetcode-go/tree/master/algorithms/0002_Two_Add 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 实例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 题解 思路 主要考的是链表这种数据结构的理解,以及链表长度不等时怎么合并链表问题。 /** * Definition for sing...阅读全文

博文 2020-01-01 02:32:55 风云风雨

2019年5月份找工作面试知识点总结

面试知识点 算法和数据结构 常用算法 排序算法 各种排序算法的时间复杂度,是否稳定 内部排序 快速排序 nlgn 不稳定 冒泡排序 n2 稳定 堆排序 nlgn 不稳定 大小堆 归并排序 选择排序 n2 不稳定 5 3 5 2 4 插入排序 n2 稳定 希尔排序 不稳定 手写冒泡 手写快排 外部排序 查找算法 顺序查找 二分(手写) 递归 非递归 二叉搜索树 平衡搜索树 红黑树 多路搜索树 B tree B+tree 一致性hash 减少数据迁移 [0,2的32次方 - 1] 虚拟节点 客户端实现 动态规划dp 最长公共子序列 和最大的连续子序列 M*N棋盘问题 字符串处理 数据结构 数组 链表 队列 栈 堆 树 二叉树 红黑树 图 hashtable 常见算法题 剑指offter 单链表反...阅读全文

博文 2020-03-16 17:32:55 airect

golang 中拿 slice 当 queue 和拿 list 当 queue

目录 前言 拿 slice 当 queue 拿 list 当 queue 性能对比 换一个场景再对比 总结 前言 我记得曾经有一次参加面试时,在答题过程中非常嘴欠地说了一句:“我之所以代码这么写,因为在 golang 中没有内置的无限长度 queue 的实现……”,当时说完我就后悔了,面试我的人,前几个问题本就有那么几分刻薄,一听这一句,立马就来劲了:“谁说没有?谁说没有?” 好在我连连改口,巧舌如簧,搪塞了过去。我明白,在大牛们的手里,只需最简单的数组,稍微加几个“简单的”函数,摇身一变,就可以成为“现成的”队列、栈、环、二叉树、图…… 我不仅不是大牛,我还是个懒汉,我希望的内置的队列,是拿过来就能 dequeue、enqueue 的工具,但 golang 的标准库里并没有名字叫 queu...阅读全文

博文 2019-08-04 20:08:50 Wolfogre's Blog

轻松学习区块链2 - 简单区块链的实现

源码地址: [https://github.com/wangshizebin/minibc】 区块 我们从“区块链”的“区块”部分开始。区块是区块链中最基本的数据结构,在区块链中,区块存储了有价值信息。例如,比特币区块存储了交易数据,除此之外,区块中还包含其它信息:版本号,当前时间和前一个块的哈希值等。我们把bitcoin的区块定义稍作简化,作为MiniBC的区块定义: type Block struct { Version int32 //协议版本号 HashPrevBlock []byte //上一个区块的hash值,长度为32个字节 Time int32 //时间戳,从1970.01.01 00:00:00到当前时间的秒数 Bits int32 //工作量证明(POW)的难度 Nonc...阅读全文

博文 2019-05-17 14:34:42 泽宾