您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)python實(shí)現(xiàn)兩個(gè)隊(duì)列的數(shù)據(jù)合并及排序的示例分析,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
最近數(shù)據(jù)庫(kù)學(xué)習(xí)中,體會(huì)到數(shù)據(jù)庫(kù)中大大小小的數(shù)據(jù)處理,都離不開(kāi)數(shù)據(jù)算法,有效的開(kāi)始理解一些算法會(huì)對(duì)某些數(shù)據(jù)庫(kù)設(shè)計(jì)中的理念會(huì)更深入的理解。
本次的問(wèn)題是從兩個(gè)隊(duì)列的數(shù)據(jù)合并并進(jìn)行排序開(kāi)始的。
以下僅僅是假設(shè),如果我們從數(shù)據(jù)庫(kù)中獲取的數(shù)據(jù),并且是多線程的獲取,而后續(xù)需要將每個(gè)線程獲取的數(shù)據(jù)進(jìn)行一個(gè)合并,并且查詢(xún)語(yǔ)句要求的是需要進(jìn)行排序的,則我們?cè)讷@得了這些值后,怎么在內(nèi)存里面將他們進(jìn)行一個(gè)從小到大的排序。
如上圖在獲得了某些值,并且分別這些值在兩個(gè)隊(duì)列中,需要的最終的結(jié)果是將他們一次性輸出,并形成一個(gè)排序的隊(duì)列。
這里利用了python來(lái)將下面的兩個(gè)隊(duì)列進(jìn)行一個(gè)合并排序輸出
arry1_copy = arry1.copy() #生成一個(gè)arry1列表一模一樣列表,并準(zhǔn)備讓這個(gè)列表作為最后輸出的列表
每個(gè)列表中的元素都有角標(biāo),都是從0開(kāi)始,這里以角標(biāo)作為指明元素的標(biāo)志,可以認(rèn)為是指針的替代品。
這里以隊(duì)列arry2 作為數(shù)據(jù)提取的對(duì)象隊(duì)列,逐一將元素提取,和隊(duì)列1 進(jìn)行對(duì)比,如果值比對(duì)比的隊(duì)列1值小,就直接插入到新加入的隊(duì)列的對(duì)比值之前,直到隊(duì)列的值2都被選擇完畢。
看似這端程序可以解決這個(gè)兩個(gè)隊(duì)列的數(shù)據(jù)重組的問(wèn)題,實(shí)際上漏洞不少
問(wèn)題來(lái)了,程序原封不動(dòng),直接將隊(duì)列的值的數(shù)量變化,隊(duì)列1 的值的數(shù)據(jù)個(gè)數(shù)小于隊(duì)列2的數(shù)量,我們?cè)倏矗Y(jié)果就變成了上圖這樣。
如何解決隊(duì)列1 比隊(duì)列2 的元素小的問(wèn)題,那我們?cè)谶M(jìn)行程序處理前,可以對(duì)隊(duì)列1 和隊(duì)列 2 進(jìn)行一個(gè)比較,那個(gè)元素多,那個(gè)就是隊(duì)列 1 。
在修改程序后,增加了一個(gè)判斷,如果隊(duì)列1 的數(shù)值數(shù)量比隊(duì)列2的數(shù)值數(shù)量小,則兩個(gè)隊(duì)列互換位置,就可以解決問(wèn)題。但實(shí)際上,即使這樣解決后,還是有問(wèn)題,因?yàn)殛?duì)列2的值只有一個(gè),在下圖的位置,如果隊(duì)列2只有一個(gè)值的情況下,會(huì)觸發(fā)在新的隊(duì)列尾部,還會(huì)加入一個(gè)隊(duì)列2的值。
結(jié)果就是下面那樣,多了一個(gè)1被重新插入了一次
在此修改代碼,但實(shí)際上就算是這樣,這個(gè)程序還是有問(wèn)題
#!/usr/bin/python3
# -*- coding: utf-8 -*-
arry1 = [1]
arry2 = [2,7,10,13]
if (len(arry1) > len(arry2)):
arry_copy = arry1.copy()
for i in range(0,len(arry2)):
init_1= 0
while init_1 < len(arry1):
if arry2[i] < arry_copy[init_1]:
arry_copy.insert(init_1 + i ,arry2[i])
break
else:
init_1 += 1
else:
if len(arry2) != 1:
arry_copy = arry_copy + arry2[i:]
print (arry_copy)
else:
arry2_copy = arry1.copy()
arry1_copy = arry2.copy()
arry1 = arry1_copy.copy()
arry2 = arry2_copy.copy()
arry_copy = arry1.copy()
for i in range(0, len(arry2)):
init_1 = 0
while init_1 < len(arry1):
if arry2[i] < arry_copy[init_1]:
arry_copy.insert(init_1 + i, arry2[i])
break
else:
init_1 += 1
else:
if len(arry2) != 1:
arry_copy = arry_copy + arry2[i:]
print(arry_copy)
問(wèn)題在哪里,在如果兩個(gè)隊(duì)列的值是一樣的情況下,或有數(shù)據(jù)重復(fù)的情況?,所以還需要在此修改程序,發(fā)現(xiàn)兩個(gè)列表中的重復(fù)或包含的情況,來(lái)將其避免掉。
所以通過(guò)一段不值得一提的算法小程序,就可見(jiàn)要搞出一個(gè)數(shù)據(jù)庫(kù)的不容易。
上述就是小編為大家分享的python實(shí)現(xiàn)兩個(gè)隊(duì)列的數(shù)據(jù)合并及排序的示例分析了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。