首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >O符号和合并两个已经排序的数组

O符号和合并两个已经排序的数组
EN

Stack Overflow用户
提问于 2021-05-23 09:11:32
回答 2查看 391关注 0票数 1

我被告知将两个已经排序的数组,大小不同的A和B合并成一个数组,C在线性时间内。

通过线性时间,我知道这个算法的时间复杂度必须是O(n)。后来,我还被告知在合并数组时执行排序。

我的一个想法是创建一个算法,在两个数组中都有两个指针,指向最小的元素。指向的最小元素将进入新的数组。当一个数组耗尽时,另一个数组的其余元素将复制到新数组中。

由于我几个月前刚开始编程,我发现这很难实现,因此我决定执行合并排序(MS),因为它最类似于上面提到的算法。然而,我关心的是MS本身的时间复杂性- O(nlogn)

然而,考虑到这两个数组已经被排序,MS的时间复杂度会降低还是保持不变?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-23 09:48:58

您的任务是实现合并算法的合并阶段。mergesort具有O(N.log(N))对数据集排序的复杂性,但每个合并阶段的线性时间与合并集的长度成正比。

以下是这方面的伪代码:

代码语言:javascript
运行
AI代码解释
复制
merge(array a, array b into array c)
    int i = 0, j = 0, k = 0;
    while (i < len(a) and j < len(b)) {
        if (a[i] <= b[j]) {
            c[k++] = a[i++];
        } else {
            c[k++] = b[j++];
        }
    }
    while (i < len(a)) {
        c[k++] = a[i++];
    }
    while (j < len(b)) {
        c[k++] = b[j++];
    }
}

复杂度是线性的,因为每个循环中的每个步骤都将一个元素复制到c数组中,总共需要len(a) + len(b)步骤。

票数 4
EN

Stack Overflow用户

发布于 2021-05-23 09:56:01

将两个大小不同的数组合并成一个数组,C为线性时间。

代码语言:javascript
运行
AI代码解释
复制
int *mergeArrays(const int *array1, const int *array2, size_t size1, size_t size2, int asc)
{
    int *result = malloc((size1 + size2) * sizeof(*array1));
    size_t index1 = 0, index2 = 0;
    size_t i;


    for(i = 0; i < size1 + size2 && index1 < size1 && index2 < size2; i++)
    {   
        if(asc)
        {
            if(array1[index1] > array2[index2]) result[i] = array2[index2++];
            else result[i] = array1[index1++];
        }
        else
        {
            if(array1[index1] > array2[index2]) result[i] = array2[index2++];
            else result[i] = array1[index1++];
        }
    }
    if(index1 == size1) memcpy(result + i, array2 + index2, sizeof(result) * (size2 - index2));
    if(index2 == size2) memcpy(result + i, array1 + index1, sizeof(result) * (size1 - index1));
    return result;
}

https://godbolt.org/z/PY8Ysv319

代码语言:javascript
运行
AI代码解释
复制
int cmpfunc (const void * a, const void * b) {
   return ( *(int*)a - *(int*)b );
}

void sort(int *array, size_t size)
{
    qsort(array, size, sizeof(array[1]), cmpfunc);
}

int *mergeArrays(const int *array1, const int *array2, size_t size1, size_t size2, int asc)
{
    int *result = malloc((size1 + size2) * sizeof(*array1));
    size_t index1 = 0, index2 = 0;
    size_t i;


    for(i = 0; i < size1 + size2 && index1 < size1 && index2 < size2; i++)
    {   
        if(asc)
        {
            if(array1[index1] > array2[index2]) result[i] = array2[index2++];
            else result[i] = array1[index1++];
        }
        else
        {
            if(array1[index1] > array2[index2]) result[i] = array2[index2++];
            else result[i] = array1[index1++];
        }
    }
    if(index1 == size1) memcpy(result + i, array2 + index2, sizeof(result) * (size2 - index2));
    if(index2 == size2) memcpy(result + i, array1 + index1, sizeof(result) * (size1 - index1));
    return result;
}

int main(void)
{
    srand(time(NULL));
    size_t size1 = rand() % 20, size2 = rand() % 20;
    int *mergedArray;

    if(size1 < 5) size1 += 5;
    if(size2 < 5) size2 += 5;

    int array1[size1], array2[size2];

    for(size_t i = 0; i < size1; i++)
        array1[i] = rand();
    for(size_t i = 0; i < size2; i++) 
        array2[i] = rand();
    sort(array1, size1);
    sort(array2, size2);

    for(size_t i = 0; i < size1; i++)
        printf("array1[%2zu] = %d\n", i, array1[i]);
    for(size_t i = 0; i < size2; i++)
        printf("array2[%2zu] = %d\n", i, array2[i]);

    mergedArray = mergeArrays(array1, array2, size1, size2, 1);
    for(size_t i = 0; i < size2 + size1; i++)
        printf("result[%2zu] = %d\n", i, mergedArray[i]);
}

您需要添加内存分配检查、空指针检查等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67662434

复制
相关文章
如何在附近商户中查找离你最近的商家?
根据用户当前位置和用户所选择范围, 在数据库中查询后将结果在数据库中排序或者在内存中排序, 返回给用户
天下之猴
2024/09/16
2440
如何精准地找到问题答案
搜索,是每个开发者必备功力。然而,在实际工作中,由于所用搜索引擎的限制,总是会遇到各种各样的坑。下面罗列几个,看看你是否遇到过。
老齐
2020/05/14
6980
自学java,如何快速地找到工作
    本人最近一直在帮零基础的java开发者提升能力和找工作,在这个过程中,发现零基础的java程序员,在自学和找工作时,普遍会出现一些问题,同时在实践过程中,也总结出了一些能帮零基础java开发尽快提升能力和尽快找工作的经验。在本文里,就将围绕零基础java开发自学和找工作这个过程,给出一些相关的建议。
用户1153489
2022/05/10
7940
如何在折线图上添加动画效果?
要在 Chart.js 的折线图上添加动画效果,可以使用 Chart.js 提供的配置选项来实现。以下是一个示例,展示了如何在折线图上添加简单的动画效果:
王小婷
2023/09/09
5190
如何在地图上寻找最密集点的位置?
  最近我在工作中遇到了一个小的需求点,大概是需要在地图上展示出一堆点中的点密度最密集的位置。最开始没想到好的方法,就使用了一个非常简单的策略——所有点的坐标求平均值,这个方法大部分的时候好用,因为大部分城市所有点位基本上都是围绕某个中心点向四周发散的。但我们实际在线上使用的时候,遇到了两个特殊的case。
xindoo
2024/08/07
1410
如何在地图上寻找最密集点的位置?
干货 | Siri 语音识别的小心机:你在哪里,就能更准确地识别那附近的地址
AI 科技评论按:这篇文章来自苹果机器学习日记(Apple Machine Learning Journal)。与其他科技巨头人工智能实验室博客的论文解读、技术成果分享不同,苹果的机器学习日记虽然也是介绍他们对机器学习相关技术的心得体会,但侧重点在于技术产品的实现过程、技术资源用户体验之间的取舍,更像是「产品经理的 AI app 研发日记」。过往内容可以参见 如何设计能在Apple Watch上实时运行的中文手写识别系统,苹果揭秘「Hey Siri」的开发细节,为了让iPhone实时运行人脸检测算法,苹果原来做了这么多努力。
AI科技评论
2018/09/21
2K0
干货 | Siri 语音识别的小心机:你在哪里,就能更准确地识别那附近的地址
超市里的潜规则,你被骗了吗?
都说买的没有卖的精,赚钱是人之常情。在琳琅满目的商品中,超市到底隐藏了多少秘密?今天就让我们一起揭秘超市中的潜规则,看看这些消费心理和商业秘密你懂多少?
用户1756920
2018/07/23
5230
超市里的潜规则,你被骗了吗?
谷歌自动驾驶项目开始帮助超市接送顾客
Alphabet(谷歌母公司)旗下的Waymo公司表示,该公司正开始尝试将沃尔玛超市的顾客接送到位于亚利桑那州菲尼克斯的沃尔玛门店。
人工智能快报
2018/08/17
3250
如何在 GitHub 上找到你要的代码?
你在 GitHub 上搜索代码时,是怎么样操作的呢?是不是就像这样,直接在搜索框里输入要检索的内容,然后不断在列表里翻页找自己需要的内容?
Crossin先生
2019/10/24
2K0
如何快准狠地找到相关领域的经典文献?
大多做科研的童鞋们大概都会遇到一个头疼的问题:怎么找文献?如何保证找到的文献都是相关领域的经典文献?之前我们有两篇推送:
生信宝典
2018/11/22
1.3K0
【周末漫谈】如何清晰地找到合适的数据挖掘算法?
再看看数据科学家应有的技术技能和领域: 继续一起看看数据分析师的选模思路: 数据科学应掌握的12种算法: 最后看一个数据挖掘大牛,用程序算法做人生选择
钱塘数据
2018/03/06
8000
【周末漫谈】如何清晰地找到合适的数据挖掘算法?
如何在Ubuntu上找到Redis日志
日志对于Redis安装的故障排除至关重要。你可能会问自己“我的Redis在哪里登录?” 或者“Redis在Ubuntu 14.04上存储日志文件的位置是什么?”
编程男孩
2018/09/27
5K0
Java校园超市系统超市商城源码超市网站
java使用ssm开发的校园超市系统,为方便学生网上购物,用户可以注册浏览商品,加入购物车或者直接下单购买,在个人中心管理收货地址和订单,管理员也就是商家登录后台可以发布商品,上下架商品,处理待发货订单等。
飞一样的编程
2023/01/10
1.7K0
Java校园超市系统超市商城源码超市网站
【门店小程序如何在附近】门店小程序怎么发布
随着小程序功能的逐步新增,小程序无疑成为今年移动互联网最大的热门。那么,如何注册、认证、绑定、关联小程序呢?
用户1745481
2019/01/08
2.8K0
Redis如何让你加到了附近的人
Redis3.2开始的Geo模块.可通过二维的经纬度表示.使用勾股定理算出元素之间的距离,通过矩形区域现定元素数量,然后按着距离排序。其次,交友软件中附近的人非常频繁,所以推出了Redis的地址位置距离排序算法GeoHash。
疯狂的KK
2020/10/27
8000
Redis如何让你加到了附近的人
【门店小程序如何在附近】门店小程序怎么发布
随着小程序功能的逐步新增,小程序无疑成为今年移动互联网最大的热门。那么,如何注册、认证、绑定、关联小程序呢?
用户1745481
2019/04/19
2.6K0
【门店小程序如何在附近】门店小程序怎么发布
如何在 GitHub 上找到免费且实用的软件?
今天稍微调整一下,分享 GitHub 上几个比较不错的项目合集,让你们可以在上面找到一些实用的软件。
GitHubDaily
2019/06/28
1.3K0
如何在 GitHub 上找到免费且实用的软件?
用K-Means、Foursquare和Folium聚集村庄,在大马尼拉寻找新鲜农产品供应商
作者 | Francesca Picache 编译 | VK 来源 | Towards Data Science
磐创AI
2021/04/21
1.2K0
用K-Means、Foursquare和Folium聚集村庄,在大马尼拉寻找新鲜农产品供应商
Java超市系统超市自提超市多商家系统源码超市自提网站
Ssm多商家超市自提系统。用户注册申请开店成为商家,普通注册用户下单时选择离自己较近的自提点次日取货。管理员进行店铺审核、用户、分类管理等。
飞一样的编程
2022/12/17
9530
如何在 Linux 下快速找到被删除的文件
日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如 Centos,可能大文件就是 /var/log/messages。
PHP开发工程师
2021/05/29
3.2K0

相似问题

在加载MySQL数据库时遇到问题

12

加载MNIST数据库时遇到问题

11

在将数据加载到数据库时遇到问题

15

从数据库加载数据时遇到问题

20

代码点火器->在加载多个库/类时遇到问题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档