erlang下lists模塊sort(排序)方法源碼解析(二)

上接erlang下lists模塊sort(排序)方法源碼解析(一),到目前為止,list列表已經被分割成N個列表,而且每個列表的元素是有序的(從大到小)

下面我們重點來看看mergel和rmergel模塊,因為我們先前主要分析的split_1_*對應的是rmergel,我們先從rmergel查看,如下

.......................................................

split_1(X, Y, [], R, Rs) ->
   rmergel([[Y, X | R] | Rs], []).

.......................................................
split_1_1(X, Y, [], R, Rs, S) ->    rmergel([[S], [Y, X | R] | Rs], []).
.............................................................

rmergel的代碼比較多,看一下發現其實思路非常清晰,

1 rmergel([[H3 | T3], [H2 | T2], T1 | L], Acc) ->
2     rmergel(L, [rmerge3_1(T1, [], H2, T2, H3, T3) | Acc]);
3 rmergel([[H2 | T2], T1], Acc) ->
4     mergel([rmerge2_1(T1, H2, T2, []) | Acc], []);
5 rmergel([L], Acc) ->
6     mergel([lists:reverse(L, []) | Acc], []);
7 rmergel([], Acc) ->
8     mergel(Acc, []).

當列表的個數>=3超過就用拿3個進行比較合并rmerge3_1實現,把這3個列表拼成1個有序的列表(拼完成了從小到大);剩下的按照這個邏輯

當然列表=2就拿2個進行比較合并rmerge2_1實現,把這2個列表拼成1個有序的列表(拼完成了從小到大)

當列表只有1個的時候,這個列表就是有序的了

整個邏輯是這樣的,當列表大于等于2個,先調用rmerge3_1,如果H1>=H2就調用rmerge3_21,否則就調用rmerge3_12,然后rmerge3_21如果H3>=H1就說明H3最大,然后繼續比較

總得來說,就是把3個列表的第一個元素拿出來,比較,最大的放變量M里面,根據比較的順序不同,使用不同的函數。

按照這個理解,復雜程度應該是log3n*n不是先前理解的n,

可是這里不能理解的是為什么要拿3個來比較,

我按照一次拿2個的邏輯來寫,代碼就簡單很多,可是運行的時間差不多是原作者的的1.5-2倍,實在不能理解

附上我一次拿2個列表的邏輯代碼

my_rmerge([H1,H2|T], R) ->my_rmerge(T, [my_rmerge2(H1, H2, [])|R]);
my_rmerge([H1], R) ->my_merge([lists:reverse(H1)|R], []);
my_rmerge([], [R]) ->R;
my_rmerge([], R) ->my_merge(R, []).my_rmerge2([H1|T1],[H2|T2], List) when H2 >= H1 ->([H1|T1], T2, [H2|List]);
my_rmerge2([H1|T1],[H2|T2], List) ->my_rmerge2(T1, [H2|T2], [H1|List]);
my_rmerge2([], L2, List) ->lists:reverse(L2, List);
my_rmerge2(L1, [], List) ->lists:reverse(L1, List).my_merge([H1,H2|T], R) ->my_merge(T, [my_merge2(H1, H2, [])|R]);
my_merge([H1], R) ->my_rmerge([lists:reverse(H1)|R], []);
my_merge([], [R]) ->lists:reverse(R);
my_merge([], R) ->my_rmerge(R, []).my_merge2([H1|T1],[H2|T2], List) when H2 < H1 ->my_merge2([H1|T1], T2, [H2|List]);
my_merge2([H1|T1],[H2|T2], List) ->my_merge2(T1, [H2|T2], [H1|List]);
my_merge2([], L2, List) ->lists:reverse(L2, List);
my_merge2(L1, [], List) ->lists:reverse(L1, List).

查看對比結果

 1 95> timer:tc(tt1, mysort, [B2]).
 2 {48842,
 3  [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
 4   23,24,25,26,27|...]}
 5 96> timer:tc(tt1, mysort, [B2]).
 6 {53618,
 7  [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
 8   23,24,25,26,27|...]}
 9 97> timer:tc(lists, sort, [B2]).
10 {31179,
11  [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
12   23,24,25,26,27|...]}
13 98> timer:tc(lists, sort, [B2]).
14 {29326,
15  [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
16   23,24,25,26,27|...]}

B2是一個1到100000的亂序列表,為什么差別會這么大,

有沒有大神解釋一下,按這樣的邏輯,如果一次拿4個是不是更塊,代碼當然更多~~~

?

轉載于:https://www.cnblogs.com/tudou008/p/9078302.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389570.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洛谷P4841 城市規劃(多項式求逆)

傳送門 這題太珂怕了……如果是我的話完全想不出來…… 題解 1 //minamoto2 #include<iostream>3 #include<cstdio>4 #include<algorithm>5 #define ll long long6 #define swap(x,y) (x^y,y^x,x^y)7 #define mul(x,y) (1ll*(x)*(y)%P)8 #define add(x,y) (x…

支撐阻力指標_使用k表示聚類以創建支撐和阻力

支撐阻力指標Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without seek…

高版本(3.9版本)python在anaconda安裝opencv庫及skimage庫(scikit_image庫)諸多問題解決辦法

今天開始CV方向的學習&#xff0c;然而剛拿到基礎代碼的時候發現 from skimage.color import rgb2gray 和 import cv2標紅&#xff08;這里是因為我已經配置成功了&#xff0c;所以沒有紅標&#xff09;&#xff0c;我以為是單純兩個庫沒有下載&#xff0c;去pycharm中下載ski…

python 實現斐波那契數列

# coding:utf8 __author__ blueslidef fun(arg1,arg2,stop):if arg10:print(arg1,arg2)arg3 arg1arg2print(arg3)if arg3<stop:arg3 fun(arg2,arg3,stop)fun(0,1,100)轉載于:https://www.cnblogs.com/bluesl/p/9079705.html

單機安裝ZooKeeper

2019獨角獸企業重金招聘Python工程師標準>>> zookeeper下載、安裝以及配置環境變量 本節介紹單機的zookeeper安裝&#xff0c;官方下載地址如下&#xff1a; https://archive.apache.org/dist/zookeeper/ 我這里使用的是3.4.11版本&#xff0c;所以找到相應的版本點…

均線交易策略的回測 r_使用r創建交易策略并進行回測

均線交易策略的回測 rR Programming language is an open-source software developed by statisticians and it is widely used among Data Miners for developing Data Analysis. R can be best programmed and developed in RStudio which is an IDE (Integrated Development…

opencv入門課程:彩色圖像灰度化和二值化(采用skimage庫和opencv庫兩種方法)

用最簡單的辦法實現彩色圖像灰度化和二值化&#xff1a; 首先采用skimage庫&#xff08;skimage庫現在在scikit_image庫中&#xff09;實現&#xff1a; from skimage.color import rgb2gray import numpy as np import matplotlib.pyplot as plt""" skimage庫…

SVN中Revert changes from this revision 跟Revert to this revision

譬如有個文件&#xff0c;有十個版本&#xff0c;假定版本號是1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9&#xff0c;10。Revert to this revision&#xff1a; 如果是在版本6這里點擊“Revert to this rev…

歸 [拾葉集]

歸 心歸故鄉 想象行走在 鄉間恬靜小路上 讓那些疲憊的夢 都隨風飛散吧&#xff01; 不去想那些世俗 人來人往 熙熙攘攘 秋日午后 陽光下 細數落葉 來日方長 世上的路 有詩人、浪子 歌詠吟唱 世上的人 在欲望、信仰中 彷徨 彷徨又迷茫 親愛的人兒 快結束那 無休止的獨自流浪 莫要…

instagram分析以預測與安的限量版運動鞋轉售價格

Being a sneakerhead is a culture on its own and has its own industry. Every month Biggest brands introduce few select Limited Edition Sneakers which are sold in the markets according to Lottery System called ‘Raffle’. Which have created a new market of i…

opencv:用最鄰近插值和雙線性插值法實現上采樣(放大圖像)與下采樣(縮小圖像)

上采樣與下采樣 概念&#xff1a; 上采樣&#xff1a; 放大圖像&#xff08;或稱為上采樣&#xff08;upsampling&#xff09;或圖像插值&#xff08;interpolating&#xff09;&#xff09;的主要目的 是放大原圖像,從而可以顯示在更高分辨率的顯示設備上。 下采樣&#xff…

CSS魔法堂:那個被我們忽略的outline

前言 在CSS魔法堂&#xff1a;改變單選框顏色就這么吹毛求疵&#xff01;中我們要模擬原生單選框通過Tab鍵獲得焦點的效果&#xff0c;這里涉及到一個常常被忽略的屬性——outline&#xff0c;由于之前對其印象確實有些模糊&#xff0c;于是本文打算對其進行稍微深入的研究^_^ …

初創公司怎么做銷售數據分析_初創公司與Faang公司的數據科學

初創公司怎么做銷售數據分析介紹 (Introduction) In an increasingly technological world, data scientist and analyst roles have emerged, with responsibilities ranging from optimizing Yelp ratings to filtering Amazon recommendations and designing Facebook featu…

opencv:灰色和彩色圖像的像素直方圖及直方圖均值化的實現與展示

直方圖及直方圖均值化的理論&#xff0c;實現及展示 直方圖&#xff1a; 首先&#xff0c;我們來看看什么是直方圖&#xff1a; 理論概念&#xff1a; 在圖像處理中&#xff0c;經常用到直方圖&#xff0c;如顏色直方圖、灰度直方圖等。 圖像的灰度直方圖就描述了圖像中灰度分…

mysql.sock問題

Cant connect to local MySQL server through socket /tmp/mysql.sock 上述提示可能在啟動mysql時遇到&#xff0c;即在/tmp/mysql.sock位置找不到所需要的mysql.sock文件&#xff0c;主要是由于my.cnf文件里對mysql.sock的位置設定導致。 mysql.sock默認的是在/var/lib/mysql,…

交換機的基本原理配置(一)

1、配置主機名 在全局模式下輸入hostname 名字 然后回車即可立馬生效&#xff08;在生產環境交換機必須有自己唯一的名字&#xff09; Switch(config)#hostname jsh-sw1jsh-sw1(config)#2、顯示系統OS名稱及版本信息 特權模式下&#xff0c;輸入命令 show version Switch#show …

opencv:卷積涉及的基礎概念,Sobel邊緣檢測代碼實現及Same(相同)填充與Vaild(有效)填充

濾波 線性濾波可以說是圖像處理最基本的方法&#xff0c;它可以允許我們對圖像進行處理&#xff0c;產生很多不同的效果。 卷積 卷積的概念&#xff1a; 卷積的原理與濾波類似。但是卷積卻有著細小的差別。 卷積操作也是卷積核與圖像對應位置的乘積和。但是卷積操作在做乘…

機器學習股票_使用概率機器學習來改善您的股票交易

機器學習股票Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without seek…

BZOJ 2818 Gcd

傳送門 題解&#xff1a;設p為素數 &#xff0c;則gcd(x/p,y/p)1也就是說求 x&#xff0f;p以及 y&#xff0f;p的歐拉函數。歐拉篩前綴和就可以解決 #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <map&…

LeetCode387-字符串中的第一個唯一字符(查找,自定義數據結構)

一開始想用HashMap&#xff0c;把每個字符放進去&#xff0c;然后統計出現的次數。 使用LinkedHashMap的話&#xff0c;鍵值對的順序都是不會變的。 LinkedHashMap<Character,Integer> map new LinkedHashMap<>();map.put(i,1111);map.put(j,2222);map.put(k,3333…