获得徽章 0
快速排序
基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

「时间复杂度:O(nlogn)」

思路
选择数组中间数作为基数,并从数组中取出此基数
准备两个数组容器,遍历数组,逐个与基数比对,较小的放左边容器,较大的放右边容器;
递归处理两个容器的元素,并将处理后的数据与基数按大小合并成一个数组,返回。
展开
评论
#挑战每日一条沸点#
计数排序

从名称上就知道,它的思想:就是把数组元素作为数组的下标,然后用一个临时数组统计该元素出现的次数。

数组的数据必须是整数,而且最大最小值相差的值不要过大,对于「数据是负数的话,我实现的方案对此有优化」。

「时间复杂度:O(n+k)」

思路

1.计算出差值d,最小值小于0,加上本身add

2.创建统计数组并统计对应元素个数

3.统计数组做变形,后面的元素等于前面的元素之和,也就是排名数组

4.遍历原始数组,从统计数组中找到正确位置,输出到结果数组

     
展开
评论
#挑战每日一条沸点#
冒泡排序

这个名字的由来是向泡泡一样浮起来,脑补一下,就是每次比较相邻的两个元素大小,然后慢慢'漂浮'起来,我瞎掰的,看思路吧。

「时间复杂度O(n*n)」

思路

比较相邻的元素,前者比后者大的话,两者交换位置。

对每一对相邻元素做相同操作,从开始第一对到最后一对,这样子最后的元素就是最大元素。

针对n个元素重复以上步骤,每次循环排除当前最后一个。

重复步骤1~3,直到排序完成。

动画

冒泡排序

代码实现

// 最外层循环控制的内容是循环次数 // 每一次比较的内容都是相邻两者之间的大小关系 let BubbleSort = function (arr, flag = 0) {     let len = arr.length     for (let i = 0; i < len - 1; i++) {         for (let j = 0; j < len - 1 - i; j++) {             if (arr[j] > arr[j + 1]) {                 [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]             }         }     }     return flag ? arr.reverse() : arr } let arr = [2, 9, 6, 7, 4, 3, 1, 7] console.log(BubbleSort(arr, 1))
展开
评论
#挑战每日一条沸点#
线性数据结构

数组

       数组对应的英文是array,是有限个相同类型的变量所组成的有序集合,数组中的每一个变量被称为元素。数组是最为简单、最为常用的数据结构。



      数组的另一个特点,是在内存中顺序存储,因此可以很好地实现逻辑上的顺序表。内存是由一个个连续的内存单元组成的,每一个内存单元都有自己的地址。在这些内存单元中,有些被其他数据占用了,有些是空闲的。 数组中的每一个元素,都存储在小小的内存单元中,并且元素之间紧密排列, 既不能打乱元素的存储顺序,也不能跳过某个存储单元进行存储。

        数组拥有非常高效的随机访问能力,只要给出下标,就可以用常量时间找到对应元素。有一种高效查找元素的算法叫作二分查找, 就是利用了数组的这个优势。

       数组的劣势,体现在插入和删除元素方面。由于数组元素连续紧密地存储在内存中,插入、删除元素都会导致大量元素被迫移动,影响效率。

      数组所适合的是读操作多、写操作少的场景

展开
评论
#挑战每日一条沸点#
算法

        在计算机领域里,算法是一系列程序指令,用于处理特定的运算和逻辑问题。 衡量算法优劣的主要标准是时间复杂度和空间复杂度。

数据结构 

       数据结构是数据的组织、管理和存储格式,其使用目的是为了高效地访问和修改数据。 数据结构包含数组、链表这样的线性数据结构,也包含树、图这样的复杂数据结构。 

展开
1
#挑战每日一条沸点#
零值

零值是指当你声明变量(分配内存)并未显式初始化时,始终为你的变量自动设置一个默认初始值的策略。

首先我们来看看官方有关零值(The zero value)的规范:

When storage is allocated for a variable, either through a declaration or a call of new, or when a new value is created, either through a composite literal or a call of make, and no explicit initialization is provided, the variable or value is given a default value. Each element of such a variable or value is set to the zero value for its type: false for booleans, 0 for numeric types, "" for strings, and nil for pointers, functions, interfaces, slices, channels, and maps. This initialization is done recursively, so for instance each element of an array of structs will have its fields zeroed if no value is specified.

据此我们可总结出:

对于值类型:布尔类型为 false, 数值类型为 0,字符串为 "",数组和结构会递归初始化其元素或字段,即其初始值取决于元素或字段。

对于引用类型: 均为 nil,包括指针 pointer,函数 function,接口 interface,切片 slice,管道 channel,映射 map。

展开
评论
#挑战每日一条沸点#
零值

零值是指当你声明变量(分配内存)并未显式初始化时,始终为你的变量自动设置一个默认初始值的策略。

首先我们来看看官方有关零值(The zero value)的规范:

When storage is allocated for a variable, either through a declaration or a call of new, or when a new value is created, either through a composite literal or a call of make, and no explicit initialization is provided, the variable or value is given a default value. Each element of such a variable or value is set to the zero value for its type: false for booleans, 0 for numeric types, "" for strings, and nil for pointers, functions, interfaces, slices, channels, and maps. This initialization is done recursively, so for instance each element of an array of structs will have its fields zeroed if no value is specified.

据此我们可总结出:

对于值类型:布尔类型为 false, 数值类型为 0,字符串为 "",数组和结构会递归初始化其元素或字段,即其初始值取决于元素或字段。

对于引用类型: 均为 nil,包括指针 pointer,函数 function,接口 interface,切片 slice,管道 channel,映射 map。

展开
评论
#挑战每日一条沸点#
一般开发web项目,需要处理这些

路由匹配,参数获取,ORM持久化操作,日志

更高级一些,将使用redis,Elasticsearch,以及rpc远程调用

如果你是Java转行而来,你需要首先意识到一个问题:Go语言没有Spring那种包办的生态,需要各种框架拼装起来(祈求🎈有Spring这种角色吧)好在Go的设计就是两个字:简单,所以用起来倒是不难

目前,滴滴开源了Go语言的ioc框架go- spring,但是在Go的社区中,并没有使用ioc的风气,大家仍然使用手动管理依赖的模式(可能大多数是python和C++来的人的原因,如果都是Java来的,怕是早已风靡一时)

本文需要的知识储备:Go语言基础(基础语法,json,简易web服务)

从原生Web框架整起

Go语言是一名新生儿(相比隔壁Jvav,C艹老哥),所以Go语言诞生之时就能很轻松的进行主流Web开发(不依托框架),这在Java来看,是很可怕的事情,很难想象没有汤姆猫,Java的咖啡杯还能不能轻松端起来(包括Netty框架)

所以我们首先从Go原生框架做起,从内存存储到io操作,到数据库存储,一步步升级

展开
评论
赞了这篇沸点
手艺还行,没有退步
Joins于2023-06-10 09:21发布的图片
Joins于2023-06-10 09:21发布的图片
Joins于2023-06-10 09:21发布的图片
9
#挑战每日一条沸点#
net/http -> fasthttp
地址:github.com

fasthttp号称比net/http快十倍,其优化的核心思路很简单:资源复用。

复用 goroutine,减轻 runtime 调度压力;

对象复用,大量使用 sync.Pool 减轻 GC 压力。

除了复用,还有其他的一些优化手段,例如尽量避免 string 与 []byte 的转换开销等。

这些优化技巧和最佳实践,在其 Github 主页上已经贴心给出:_github.com,建议阅读学习。

因为fasthttp的实现与标准库差距较大,所以它与net/http的 API 接口是不同的,这导致从net/http重构为fasthttp需要一些学习成本。

使用fasthttp的知名项目:Fiber、Gearbox、atreugo 等。
展开
评论
个人成就
文章被点赞 2
文章被阅读 2,171
掘力值 299
收藏集
0
关注标签
4
加入于