前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DB 从算法理解 DB 原理 --- 比较重组问题

DB 从算法理解 DB 原理 --- 比较重组问题

作者头像
AustinDatabases
发布2020-05-09 16:53:12
5290
发布2020-05-09 16:53:12
举报
文章被收录于专栏:AustinDatabases

最近数据库学习中,体会到数据库中大大小小的数据处理,都离不开数据算法,有效的开始理解一些算法会对某些数据库设计中的理念会更深入的理解。

本次的问题是从两个队列的数据合并并进行排序开始的。

以下仅仅是假设,如果我们从数据库中获取的数据,并且是多线程的获取,而后续需要将每个线程获取的数据进行一个合并,并且查询语句要求的是需要进行排序的,则我们在获得了这些值后,怎么在内存里面将他们进行一个从小到大的排序。

如上图在获得了某些值,并且分别这些值在两个队列中,需要的最终的结果是将他们一次性输出,并形成一个排序的队列。

这里利用了python来将下面的两个队列进行一个合并排序输出

arry1_copy = arry1.copy() #生成一个arry1列表一模一样列表,并准备让这个列表作为最后输出的列表

每个列表中的元素都有角标,都是从0开始,这里以角标作为指明元素的标志,可以认为是指针的替代品。

这里以队列arry2 作为数据提取的对象队列,逐一将元素提取,和队列1 进行对比,如果值比对比的队列1值小,就直接插入到新加入的队列的对比值之前,直到队列的值2都被选择完毕。

看似这端程序可以解决这个两个队列的数据重组的问题,实际上漏洞不少

问题来了,程序原封不动,直接将队列的值的数量变化,队列1 的值的数据个数小于队列2的数量,我们再看,结果就变成了上图这样。

如何解决队列1 比队列2 的元素小的问题,那我们在进行程序处理前,可以对队列1 和队列 2 进行一个比较,那个元素多,那个就是队列 1 。

在修改程序后,增加了一个判断,如果队列1 的数值数量比队列2的数值数量小,则两个队列互换位置,就可以解决问题。但实际上,即使这样解决后,还是有问题,因为队列2的值只有一个,在下图的位置,如果队列2只有一个值的情况下,会触发在新的队列尾部,还会加入一个队列2的值。

结果就是下面那样,多了一个1被重新插入了一次

在此修改代码,但实际上就算是这样,这个程序还是有问题

代码语言:javascript
复制
#!/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)

问题在哪里,在如果两个队列的值是一样的情况下,或有数据重复的情况?,所以还需要在此修改程序,发现两个列表中的重复或包含的情况,来将其避免掉。

所以通过一段不值得一提的算法小程序,就可见要搞出一个数据库的不容易。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档