求无序序列每个元素最接近的值

1、问题描述

给一个n个元素的线性表A,对于每个数Ai,找到它之前的数中,和它最接近的数。

即对于每个i,求 Ci = min{ |Ai -Aj |  | 1<= j < i}


1.2算法分析

有两种思路可以解决上诉问题:

(1) 遍历整个线性表,对每个元素 A[i] ,遍历 A[0] - A[i-1] , 求出与 A[i] 绝对值最小的元素。这种方法的效率为O(n^2)。


(2)先对线性表 A 进行排序, 将结果构造成双向链表 L 。反向遍历 A,将每个元素 A[i] , 比较 A[i] - A[i-1]  和A[i+1] - A[i] ,取两者中与 A[ i ] 更接近的,即是 A[ i ] 之前的数中与 A[ i ]最接近的。然后 将A[i] 从L中删去。则双向链表中剩下的元素就是 A[i] 前面的元素。这种方法的效率可以达到O(nlogn)。


1.3 算法过程图解




1.4 思路2算法实现

首先,需要的一个双向链表作为辅助,定义双向链表结构如下:

struct LNode{struct LNode* next;struct LNode* prev;int key;
};

给链表添加一些操作,来支持解决问题:

#include <stdio.h>
#include <malloc.h>
#include "lcl.h"//从数组里创建链表 
struct LNode* create_list_from_array( int* array,int array_length)
{struct LNode* head,*prev_node=NULL,*node;int i=0;for(i=0;i<array_length;i++){node=(struct LNode*)malloc(LEN);node->key=array[i];node->next=NULL;node->prev=prev_node;if(prev_node==NULL)    //创建第一个结点时执行 {head=node; }else{prev_node->next=node;} prev_node=node;}return head;
}//求与node结点值最接近的结点,并打印 
void get_near(struct LNode* node) 
{int a=0,b=0,c=0,ab=0,bc=0,near;if(node->prev==NULL&&node->next==NULL) {printf("no other num before %d \n",node->key);return;}if(node->prev==NULL){printf("brefore and the most nearest %d num is:%d\n",node->key,node->next->key);return;	}if(node->next==NULL){printf("brefore and the most nearest %d num is:%d\n",node->key,node->prev->key);return;	}a=node->prev->key;b=node->key;c=node->next->key;ab=b-a;bc=c-b;near=ab>bc?c:a;printf("brefore and the most nearest %d num is:%d\n",node->key,near);
}//从链表删除值为n的一个元素 
struct LNode* delete_last_n(struct LNode* list,int n)
{struct LNode* head=list,*node=list,*prev,*curr,*next;while(node!=NULL&&node->key<n){node=node->next;}prev=node->prev;curr=node;next=node->next;get_near(node);if(prev==NULL&&next==NULL){free(curr);return NULL;  			}if(prev!=NULL){prev->next=next;}else{list=next;}if(next!=NULL){     next->prev=prev;}else{prev->next=NULL;}free(curr);return list;
}       


然后,需要一个排序算法对线性表进行排序,这里使用到归并排序:

extern void print_array(int* array,int n);
//归并排序 void merge_array(int* array,int p,int q,int r){int l1=q-p+2,l2=r-q+1;int A[l1],B[l2]; //多加 1为最后一个元素赋最大值留着 int i=0,j=0,k=0;for(i=p,j=0;i<=q;i++,j++){A[j]=array[i];}A[j]=MAX_NUMBER;for(i=q+1,j=0;i<=r;i++,j++){B[j]=array[i];}B[j]=MAX_NUMBER;i=0,j=0,k=0;for(k=p;k<=r;k++){if(A[i]>B[j]){array[k]=B[j];j++;	}else{array[k]=A[i];i++;	}}
}void merge_sort(int* array,int p,int r){     //归并排序,p为计数起点,一般是0,r为数组最后序号,为n-1 if(p<r){	 int q=p+(r-p)/2;merge_sort(array,p,q);merge_sort(array,q+1,r);merge_array(array,p,q,r);}
} 


关键代码:

//初始化并运行程序 
void init(int array_length)   
{  int array[array_length],array2[array_length],i=0;struct LNode* list;get_iarray_scf(array,array_length);    //获取输入数组 copy_array(array,array2,array_length);   //保存初始数组 print_array(array,array_length);      //对数组排序 merge_sort(array,0,array_length-1);//将排序结果创建双向链表 list=create_list_from_array(array,array_length);// 从后往遍历输入数组,依次从双向链表删除 for(i=array_length-1;i>=0;--i){list=delete_last_n(list,array2[i]);}
}

附录:

1、代码

2、参考教程







本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven引入springframework的猫腻

看官网的quickstart&#xff0c;以为maven只要将quickstart里的配置复制到项目里就好了&#xff0c;但是在项目中使用jdbc和事物时&#xff0c;都提示找不到相关的类&#xff0c;才知道原来官网文档还有猫腻。 maven引入spring框架 project下框架有点多&#xff0c;点spring …

bigdecimal 小于等于0_半场0-0比分的比赛,你需要注意这些

大家好&#xff0c;我是师弟&#xff0c;今天给大家带来有关于半场0-0比赛的分析。前段时间有朋友向我吐槽道&#xff1a;“最近买半场0-0的比赛输惨了”&#xff0c;经过询问了解到他是专挑半场0-0的比赛在中场的时候买入大1.5&#xff0c;没想到输多赢少。而他的想法可能也代…

将chart放入panel中出现滚动条_聊天场景在web前端开发中的体验与优化

在日常工作中&#xff0c;如下图的聊天场景是不是很熟悉&#xff0c;没错就是我们再熟悉不过的 QQ 和微信&#xff0c;一个正常的聊天界面大致上是长这个样子的&#xff1a;这种聊天窗口的消息流有两个明显的特点&#xff1a;最新的消息和滚动条初始位置需要在列表的最底部下拉…

一个(伪)MaterialDesign风格的博客园皮肤

皮肤长什么样&#xff0c;不用我说&#xff0c;相信各位点进来的看官都能看得一清二楚。 有关其他细节呢&#xff0c;也欢迎各位在我博客里逛逛&#xff0c;帮忙挑挑刺&#xff0c;提提建议。 由于水平有限&#xff0c;暂没能用CSS处理博客园的代码高亮字体&#xff0c;实在是有…

git checkout 单个文件_IntelliJ IDEA下的使用 Git

作者| JKYO链接 | cnblogs.com/pejsidney/p/9199115.html1、Git 简介Git是目前流行的分布式版本管理系统。它拥有两套版本库&#xff0c;本地库和远程库&#xff0c;在不进行合并和删除之类的操作时这两套版本库互不影响。也因此其近乎所有的操作都是本地执行&#xff0c;所以在…

小甲鱼c语言课后作业_知识,就是力量——山财“学习小课堂”助你蓄力

编者按少年&#xff0c;你渴望 知识的力量 吗&#xff1f;我们有山财最全的学习秘籍&#xff0c;只待你的耐心翻阅与潜心修炼&#xff01;接下来&#xff0c;就让我们一起查收学习干货~内容摘要本系列推送分为【悦览篇】【干货篇】【招募篇】三大模块。【悦览篇】编者会为大家推…

初步认识spring mvc

spring mvc 01Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;即使用了MVC架构模式的思想&#xff0c;将web层进行职责解耦&#xff0c;基于请求驱动指的就是使用请求-响应模型&#xff0c;框架的目的就是帮助我们简化开发&…

sdk怎么用_PLC不支持OPC UA怎么办?别问了看完你就懂了

经常有人会烦恼这个问题&#xff1a;我的上位机软件什么功能都有&#xff0c;也支持OPC UA了&#xff0c;现在项目上准备用OPC UA的方式来获取我的PLC的数据&#xff0c;但是我的PLC却不支持OPC UA&#xff0c;怎么办呢&#xff1f;有的人碰到这个问题后就开始了“病急乱投医”…

js学习大法:用好firebug,走遍天下都不怕

用js有一段时间了&#xff0c;但是一直手感不好。平时用DW来写js代码&#xff0c;常抱怨js的编辑器的自动代码提示和调试功能用起来很不爽&#xff0c;自动代码提示十分有限&#xff0c;而且写错一个单词这样的错误都要运行整个网页之后才发现。今天闲来无聊&#xff0c;翻看了…

python杀死了excel_Python杀死了Excel|自动更新表格,告别繁琐

大家好&#xff0c;又到了Python办公自动化专题。 今天我们讲解的案例是如何使用Python自动更新Excel表格&#xff0c;简单来说就是每天都会对Excel中多个sheet进行更新&#xff0c;需要操作完后可以用程序完成第一张sheet 汇总表的更新&#xff0c;大概就是这样&#x1f447;当…

TP-LINK路由器连接网线上网教程(租房必备)

租的房子&#xff0c;房子里只有一根普通网线&#xff0c;连着房东家的路由器&#xff0c;这时可以使用TP-LINK路由器使用LAN-WAN级联的方式&#xff0c;在室内搭建一个局域网。 设置教程 准备材料&#xff1a;1根网线 重置路由器&#xff1a;启动路由器&#xff0c;使用牙签…

推荐一款非常强大的扒站工具

在平时的开发或者学习的过程中&#xff0c;我们难免会看到一些让人心动的网站&#xff0c;于是自己想把它弄下来&#xff0c;自己手工一个文件一个文件把它保存下来不太可能&#xff0c;那得累死你&#xff0c;下面我推荐一款扒站的神器&#xff0c;可以把你所喜欢的目标网站整…

无刷新分页 jquery.pagination.js

序言 这一款js分页使用起来很爽&#xff0c;自己经常用&#xff0c;做项目时总是要翻以前的项目看&#xff0c;不方便&#xff0c;这里就把他写出来方便自己以后粘帖&#xff0c;也希望能分享给大家。友情提示下&#xff1a;我有一片博客是用着个js实现的无刷新分页也很好用&am…

windows 10打开或禁用管理员账户

windows 10下默认关闭了管理员账户&#xff0c;因为权限太高&#xff0c;而且win 10推荐通过网络账户登录。如果要使用&#xff0c;可以通过下面的方式打开。 1、登录一个普通账户。 如果你是刚升级上来&#xff0c;普通账户都没有。那么&#xff0c;用别人的电脑下载安装老毛…

hbase filter原理_HBase应用|HBase在移动广告监测产品中的应用

1HBase在Ad Tracking的应用1.1Ad Tracking的业务场景Ad Tracking是TalkingData的移动广告监测产品&#xff0c;其核心业务模型是归因。App用户点击广告之后&#xff0c;及随后安装广告跳转到的应用或者游戏&#xff0c;Ad Tracking会对这些点击事件(用户点击广告的行为)和激活事…

eclipse 快捷键及插件

webstorm设置keymap为eclipse也可使用。 快捷键 快捷键用途使用方法编辑器事件ctrlt打开继承树将鼠标移到某个类上&#xff0c;按ctrltctrl/注释本行altshiefj生成属性注释&#xff0c;这杨的/**/ctrlalt 下箭头复制本行到下一行alt 下箭头移动本行到下一行ctrld删除整行alt/…

drools动态配置规则_关于规则引擎

很早之前就知道Drools&#xff0c;这几天正好有个项目&#xff0c;里面用了大量的规则定义&#xff0c;就想是否能采用Drools来解决。在github上分析了规则引擎项目&#xff0c;包括&#xff1a;Easy-ruleshttps://github.com/j-easy/easy-rules通过程序代码来完成规则引擎&…

linux安装mysql5.6

目录 准备工作 运行环境 确认你的安装版本 下载MySQL 安装MySQL 准备安装环境 编译和安装 配置MySQL 单实例配置 单实例配置方法 添加防火墙 启动MySQL 重启MySQL 多实例配置 什么是多实例 多实例配置方法 创建启动文件 初始化数据库 配置防火墙 启动MySQL 登陆MySQL 重启MySQL…

Spring 4 MVC入门实例

Spring 4发布很长一段时间了&#xff0c;从 Spring 3 到 Spring 4 有巨大的改变。网上还有很多教程是基于 Spring 3.0 的&#xff0c;甚至 Spring 2.5&#xff0c;要想按照网上的教程“按图索骥”还是挺困难的。纵有一些 Spring 4.0 MVC 的教程例子&#xff0c;也往往是 “Spri…

python写入二进制文件的库_python之写入二进制文件

概述 计算机都是以二进制存储文件的&#xff0c;如mp3、图片等&#xff0c;文本文件也是如此&#xff0c;在本节中以二进制模式写入文件 写文件的很多操作&#xff0c;与读文件的操作是相同的&#xff0c;建议先看 读取二进制文件 打开文件 读写文件&#xff0c;要先通过内置op…