Go語言標準庫中提供了sort包對整型,浮點型,字符串型切片進行排序,檢查一個切片是否排好序,使用二分法搜索函數(shù)在一個有序切片中搜索一個元素等功能。
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站設(shè)計、安圖網(wǎng)絡(luò)推廣、微信小程序、安圖網(wǎng)絡(luò)營銷、安圖企業(yè)策劃、安圖品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供安圖建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
關(guān)于sort包內(nèi)的函數(shù)說明與使用,請查看
在這里簡單講幾個sort包中常用的函數(shù)
在Go語言中,對字符串的排序都是按照字節(jié)排序,也就是說在對字符串排序時是區(qū)分大小寫的。
二分搜索算法
Go語言中提供了一個使用二分搜索算法的sort.Search(size,fn)方液段灶法:每次只需要比較㏒?n個元素,其中n為切片中元素的總數(shù)。
sort.Search(size,fn)函數(shù)接受兩個參數(shù):所處理的切片的長度和一個將目標元素與有序切片的元素相比較的函數(shù),該函數(shù)是一個閉包,如果該有序切片是鬧扮升序排列,那么在判斷時使用 有序切片的元素 = 目燃旁標元素。該函數(shù)返回一個int值,表示與目標元素相同的切片元素的索引。
在切片中查找出某個與目標字符串相同的元素索引
原文:【 】
如果有解答的不對的,麻煩各位在評論寫出來~
go的調(diào)度原理是基于GMP模型,G代表一個goroutine,不限制數(shù)量;M=machine,代表一個線程,最大1萬,所有G任務(wù)還是在M上圓腔執(zhí)行;P=processor代表一個處理器,每一個允許的M都會綁定一個G,默認與邏輯CPU數(shù)量相等(通過runtime.GOMAXPROCS(runtime.NumCPU())設(shè)置)。
go調(diào)用過程:
可以能,也可以不能。
因為go存在不能使用==判斷類型:map、slice,如果struct包含這些類型的字段,則不能比較。
這兩種類型也不能作為map的key。
類似棧操作,后進先出。
因為go的return是一個非原子性操作,比如語句 return i ,實際上分兩步進行,即將i值存入棧中作為返回值,然后執(zhí)行跳轉(zhuǎn),而defer的執(zhí)行時機正是跳轉(zhuǎn)前,所以說defer執(zhí)行時還是有機會操作返回值的。
select的case的表達式必須是一個channel類型,所有case都會被求值,求值順序自上而下,從左至右。如果多個case可以完成,則會隨機執(zhí)行一個case,如果有default分支,則執(zhí)行default分支語句。如果連default都沒有,則select語句會一念纖直阻塞,直到至少有一個IO操作可以進行。
break關(guān)鍵字可跳出select的執(zhí)行。
goroutine管理、信息傳遞。context的意思是上下文,在線程、協(xié)程中都有這個概念,它指的是程序單元的一個運行狀態(tài)、現(xiàn)場、快照,包含。context在多個goroutine中是并發(fā)安全的。
應(yīng)用場景:
例子參考:
waitgroup
channel
len:切片的長度,訪問時間復(fù)雜度為O(1),go的slice底層是對數(shù)組的引用。
cap:切片的容量,擴容是以這個值為標準。默認擴容是2倍,當達到1024的長度后,按1.25倍。
擴容:每次擴容slice底層都將先分配新的容量的內(nèi)存空間,再將老的數(shù)組拷貝到新的內(nèi)存空間,因為這個操作不是并發(fā)安全的。所以并發(fā)進行append操作,讀到內(nèi)存中的老數(shù)組可能為同一個,最終導(dǎo)致append的數(shù)據(jù)丟失。
共享:slice的底層是對數(shù)組的引用,因此如果兩個切片引用了同一個數(shù)組片段,就會形成共享底層數(shù)組。當sliec發(fā)生內(nèi)存的重新分配(如擴容)時,會對共享進行隔斷。詳細見下面例子:
make([]Type,len,cap)
map的底層是hash table(hmap類型),對key值進行了hash,并將結(jié)果的低八位用于確定key/value存在于哪個bucket(bmap類型)。再將高八位與bucket的tophash進行依次比較,確定是否存在。出現(xiàn)hash沖撞時,會通過bucket的overflow指向另一個bucket,形成一個單向鏈表。每個bucket存儲8個鍵值對。
如果要實現(xiàn)map的橘高衫順序讀取,需要使用一個slice來存儲map的key并按照順序進行排序。
利用map,如果要求并發(fā)安全,就用sync.map
要注意下set中的delete函數(shù)需要使用 delete(map) 來實現(xiàn),但是這個并不會釋放內(nèi)存,除非value也是一個子map。當進行多次delete后,可以使用make來重建map。
使用sync.Map來管理topic,用channel來做隊列。
參考:
多路歸并法:
pre class="vditor-reset" placeholder="" contenteditable="true" spellcheck="false"p data-block="0"(1)假設(shè)有K路a href=""數(shù)據(jù)流/a,流內(nèi)部是有序的,且流間同為升序或降序;
/pp data-block="0"(2)首先讀取每個流的第一個數(shù),如果已經(jīng)EOF,pass;
/pp data-block="0"(3)將有效的k(k可能小于K)個數(shù)比較,選出最小的那路mink,輸出,讀取mink的下一個;
/pp data-block="0"(4)直到所有K路都EOF。
/p/pre
假設(shè)文件又1個G,內(nèi)存只有256M,無法將1個G的文件全部讀到內(nèi)存進行排序。
第一步:
可以分為10段讀取,每段讀取100M的數(shù)據(jù)并排序好寫入硬盤。
假設(shè)寫入后的文件為A,B,C...10
第二步:
將A,B,C...10的第一個字符拿出來,對這10個字符進行排序,并將結(jié)果寫入硬盤,同時記錄被寫入的字符的文件指針P。
第三步:
將剛剛排序好的9個字符再加上從指針P讀取到的P+1位數(shù)據(jù)進行排序,并寫入硬盤。
重復(fù)二、三步驟。
go文件讀寫參考:
保證排序前兩個相等的數(shù)其在序列的前后位置順序和排序后它們兩個的前后位置順序相同的排序叫穩(wěn)定排序。
快速排序、希爾排序、堆排序、直接選擇排序不是穩(wěn)定的排序算法。
基數(shù)排序、冒泡排序、直接插入排序、折半插入排序、歸并排序是穩(wěn)定的排序算法。
參考:
head只請求頁面的首部。多用來判斷網(wǎng)頁是否被修改和超鏈接的有效性。
get請求頁面信息,并返回實例的主體。
參考:
401:未授權(quán)的訪問。
403: 拒絕訪問。
普通的http連接是客戶端連接上服務(wù)端,然后結(jié)束請求后,由客戶端或者服務(wù)端進行http連接的關(guān)閉。下次再發(fā)送請求的時候,客戶端再發(fā)起一個連接,傳送數(shù)據(jù),關(guān)閉連接。這么個流程反復(fù)。但是一旦客戶端發(fā)送connection:keep-alive頭給服務(wù)端,且服務(wù)端也接受這個keep-alive的話,兩邊對上暗號,這個連接就可以復(fù)用了,一個http處理完之后,另外一個http數(shù)據(jù)直接從這個連接走了。減少新建和斷開TCP連接的消耗。這個可以在Nginx設(shè)置,
這個keepalive_timout時間值意味著:一個http產(chǎn)生的tcp連接在傳送完最后一個響應(yīng)后,還需要hold住keepalive_timeout秒后,才開始關(guān)閉這個連接。
特別注意TCP層的keep alive和http不是一個意思。TCP的是指:tcp連接建立后,如果客戶端很長一段時間不發(fā)送消息,當連接很久沒有收到報文,tcp會主動發(fā)送一個為空的報文(偵測包)給對方,如果對方收到了并且回復(fù)了,證明對方還在。如果對方?jīng)]有報文返回,重試多次之后則確認連接丟失,斷開連接。
tcp的keep alive可通過
net.ipv4.tcp_keepalive_intvl = 75 // 當探測沒有確認時,重新發(fā)送探測的頻度。缺省是75秒。
net.ipv4.tcp_keepalive_probes = 9 //在認定連接失效之前,發(fā)送多少個TCP的keepalive探測包。缺省值是9。這個值乘以tcp_keepalive_intvl之后決定了,一個連接發(fā)送了keepalive之后可以有多少時間沒有回應(yīng)
net.ipv4.tcp_keepalive_time = 7200 //當keepalive起用的時候,TCP發(fā)送keepalive消息的頻度。缺省是2小時。一般設(shè)置為30分鐘1800
修改:
可以
tcp是面向連接的,upd是無連接狀態(tài)的。
udp相比tcp沒有建立連接的過程,所以更快,同時也更安全,不容易被攻擊。upd沒有阻塞控制,因此出現(xiàn)網(wǎng)絡(luò)阻塞不會使源主機的發(fā)送效率降低。upd支持一對多,多對多等,tcp是點對點傳輸。tcp首部開銷20字節(jié),udp8字節(jié)。
udp使用場景:視頻通話、im聊天等。
time-wait表示客戶端等待服務(wù)端返回關(guān)閉信息的狀態(tài),closed_wait表示服務(wù)端得知客戶端想要關(guān)閉連接,進入半關(guān)閉狀態(tài)并返回一段TCP報文。
time-wait作用:
解決辦法:
close_wait:
被動關(guān)閉,通常是由于客戶端忘記關(guān)閉tcp連接導(dǎo)致。
根據(jù)業(yè)務(wù)來啊~
重要指標是cardinality(不重復(fù)數(shù)量),這個數(shù)量/總行數(shù)如果過?。ㄚ吔?)代表索引基本沒意義,比如sex性別這種。
另外查詢不要使用select *,根據(jù)select的條件+where條件做組合索引,盡量實現(xiàn)覆蓋索引,避免回表。
僵尸進程:
即子進程先于父進程退出后,子進程的PCB需要其父進程釋放,但是父進程并沒有釋放子進程的PCB,這樣的子進程就稱為僵尸進程,僵尸進程實際上是一個已經(jīng)死掉的進程。
孤兒進程:
一個父進程退出,而它的一個或多個子進程還在運行,那么那些子進程將成為孤兒進程。孤兒進程將被init進程(進程號為1)所收養(yǎng),并由init進程對它們完成狀態(tài)收集工作。
子進程死亡需要父進程來處理,那么意味著正常的進程應(yīng)該是子進程先于父進程死亡。當父進程先于子進程死亡時,子進程死亡時沒父進程處理,這個死亡的子進程就是孤兒進程。
但孤兒進程與僵尸進程不同的是,由于父進程已經(jīng)死亡,系統(tǒng)會幫助父進程回收處理孤兒進程。所以孤兒進程實際上是不占用資源的,因為它終究是被系統(tǒng)回收了。不會像僵尸進程那樣占用ID,損害運行系統(tǒng)。
原文鏈接:
產(chǎn)生死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環(huán)等待條件:若干進程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。
避免方法:
端口占用:lsof -i:端口號 或者 nestat
cpu、內(nèi)存占用:top
發(fā)送信號:kill -l 列出所有信號,然后用 kill [信號變化] [進程號]來執(zhí)行。如kill -9 453。強制殺死453進程
git log:查看提交記錄
git diff :查看變更記錄
git merge:目標分支改變,而源分支保持原樣。優(yōu)點:保留提交歷史,保留分支結(jié)構(gòu)。但會有大量的merge記錄
git rebase:將修改拼接到最新,復(fù)雜的記錄變得優(yōu)雅,單個操作變得(revert)很簡單;缺點:
git revert:反做指定版本,會新生成一個版本
git reset:重置到某個版本,中間版本全部丟失
etcd、Consul
pprof
節(jié)省空間(非葉子節(jié)點不存儲數(shù)據(jù),相對b tree的優(yōu)勢),減少I/O次數(shù)(節(jié)省的空間全部存指針地址,讓樹變的矮胖),范圍查找方便(相對hash的優(yōu)勢)。
explain
其他的見:
runtime2.go 中關(guān)于 p 的定義: 其中 runnext 指針決定了下一個要運行的 g,根據(jù)英文的注釋大致意思是說:
所以當設(shè)置 runtime.GOMAXPROCS(1) 時,此時只有一個 P,創(chuàng)建的 g 依次加入 P, 當最后一個即 i==9 時,加入的最后 一個 g 將會繼承當前主 goroutinue 的剩余時間片繼續(xù)執(zhí)行,所以會先輸出 9, 之后再依次執(zhí)行 P 隊列中其它的 g。
方法一:
方法二:
[圖片上傳失敗...(image-4ef445-1594976286098)]
方法1:to_days,返回給的日期從0開始算的天數(shù)。
方法2:data_add。向日期添加指定時間間隔
[圖片上傳失敗...(image-b67b10-1594976286098)]
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px} 排序算法是《數(shù)據(jù)歷唯乎結(jié)構(gòu)與算法》中最基本的算法之一。排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。以下是冒泡排序算法:
冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。這個算法的名字由來是因為越小的元素會經(jīng)由交換慢慢"浮"到數(shù)列的頂端。
作為最簡單的排序算法之一,冒泡排序給我的感覺就像 Abandon 在單詞書里出現(xiàn)的感覺一樣,每次都在第一頁第一位,所以最熟悉。冒泡排序還有一種優(yōu)化算法,就是立肢悉一個 flag,當在一趟序列遍歷中元素沒有發(fā)生交換,則證明該序列已經(jīng)有序。但這種改進對于提升性能來
說并沒有山攜什么太大作用。 1. 算法步驟
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結(jié)尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。
針對所有的元素重復(fù)以上的步驟,除了最后一個。
持續(xù)每次對越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對數(shù)字需要比較。
2. 動圖演示
3. 什么時候最快
當輸入的數(shù)據(jù)已經(jīng)是正序時(都已經(jīng)是正序了,我還要你冒泡排序有何用?。?。
4. 什么時候最慢
當輸入的數(shù)據(jù)是反序時(寫一個 for 循環(huán)反序輸出數(shù)據(jù)不就行了,干嘛要用你冒泡排序呢,我是閑的嗎)。 5. JavaScript 代碼實現(xiàn) 實例 function bubbleSort ( arr ) {
var len = arr. length ;
for ( var i = 0 ; i arr [ j+ 1 ] :
? ? ? ? ? ? arr [ j ] , arr [ j + 1 ] = arr [ j + 1 ] , arr [ j ]
return arr
7. Go 代碼實現(xiàn) 實例 func bubbleSort ( arr [] int ) [] int {
? ? length := len ( arr )
? ? for i := 0 ; i length ; i ++ {
? ? ? ? ? ? for j := 0 ; j length - 1 - i ; j ++ {
? ? ? ? ? ? ? ? ? ? if arr [ j ] arr [ j + 1 ] {
? ? ? ? ? ? ? ? ? ? ? ? ? ? arr [ j ], arr [ j + 1 ] = arr [ j + 1 ], arr [ j ]
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? }
? ? return arr
}
8. Java 代碼實現(xiàn) 實例 public class BubbleSort implements IArraySort {
@Override
public int [ ] sort ( int [ ] sourceArray ) throws Exception {
? ? // 對 arr 進行拷貝,不改變參數(shù)內(nèi)容
? ? int [ ] arr = Arrays . copyOf ( sourceArray, sourceArray. length ) ;
? ? for ( int i = 1 ; i
數(shù)組是一個由 固定長度 的 特定類型元素 組成的序列,一個數(shù)組可以由零個或多個元素組成。 數(shù)組是值類型
數(shù)組的每個元素都可以通過索引下標來訪問,索引下標的范圍是從0開始到數(shù)組長度減1的位置,內(nèi)置函數(shù) len() 可以襪告襪返回數(shù)組中元素的個數(shù)。
2.類型的打印,結(jié)果的第二種打印方式
3.對元素的修改或者賦值
4.判斷數(shù)組是否相等:長度、類型
4.數(shù)組的地址:連續(xù)存儲的空間
5.數(shù)組的賦值、地址、取值
6.數(shù)組的默認值
7.數(shù)組的初始化
8.數(shù)組的逆置
9.求數(shù)組的最大值、最小值、平均值
10.對數(shù)組字符串進行連接
11.冒泡排序法的實現(xiàn)
12.數(shù)組做函數(shù)的參數(shù)
13.二維數(shù)組:賦值和地址
14.二維數(shù)組:打印和友洞輸出
15. 指針告激數(shù)組,每一個元素都是地址
17.數(shù)組的內(nèi)存分配