最近数据库学习中,体会到数据库中大大小小的数据处理,都离不开数据算法,有效的开始理解一些算法会对某些数据库设计中的理念会更深入的理解。
本次的问题是从两个队列的数据合并并进行排序开始的。
以下仅仅是假设,如果我们从数据库中获取的数据,并且是多线程的获取,而后续需要将每个线程获取的数据进行一个合并,并且查询语句要求的是需要进行排序的,则我们在获得了这些值后,怎么在内存里面将他们进行一个从小到大的排序。
如上图在获得了某些值,并且分别这些值在两个队列中,需要的最终的结果是将他们一次性输出,并形成一个排序的队列。
这里利用了python来将下面的两个队列进行一个合并排序输出
arry1_copy = arry1.copy() #生成一个arry1列表一模一样列表,并准备让这个列表作为最后输出的列表
每个列表中的元素都有角标,都是从0开始,这里以角标作为指明元素的标志,可以认为是指针的替代品。
这里以队列arry2 作为数据提取的对象队列,逐一将元素提取,和队列1 进行对比,如果值比对比的队列1值小,就直接插入到新加入的队列的对比值之前,直到队列的值2都被选择完毕。
看似这端程序可以解决这个两个队列的数据重组的问题,实际上漏洞不少
问题来了,程序原封不动,直接将队列的值的数量变化,队列1 的值的数据个数小于队列2的数量,我们再看,结果就变成了上图这样。
如何解决队列1 比队列2 的元素小的问题,那我们在进行程序处理前,可以对队列1 和队列 2 进行一个比较,那个元素多,那个就是队列 1 。
在修改程序后,增加了一个判断,如果队列1 的数值数量比队列2的数值数量小,则两个队列互换位置,就可以解决问题。但实际上,即使这样解决后,还是有问题,因为队列2的值只有一个,在下图的位置,如果队列2只有一个值的情况下,会触发在新的队列尾部,还会加入一个队列2的值。
结果就是下面那样,多了一个1被重新插入了一次
在此修改代码,但实际上就算是这样,这个程序还是有问题
#!/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)
问题在哪里,在如果两个队列的值是一样的情况下,或有数据重复的情况?,所以还需要在此修改程序,发现两个列表中的重复或包含的情况,来将其避免掉。
所以通过一段不值得一提的算法小程序,就可见要搞出一个数据库的不容易。