求无序序列每个元素最接近的值
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、参考教程
求无序序列每个元素最接近的值相关推荐
- 算法--微软面试题:求一个整数数组元素间最小差值
Q题目 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数. A解法 方案一:最愚笨的办法--暴力穷举 利用数组中所有数据两两相减的对比来求出这个最小差值. ...
- 求包含n(n>1)个元素的无序序列中第k小的元素。
求包含n[n>1]个元素的无序序列中第k小的元素. 题目描述 C++程序答案 题目描述 [问题描述] 编写一个实验程序,利用STL中的priority_queue(优先队列)求出包含n个元素的无 ...
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和
原题:有一序列a,大小为n,分为2部分,序列元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小,用python写. #coding=utf- ...
- 求自定类型元素序列的中位数
本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊N/2+1⌋大的元素.其中集合元素的类型为自定义的ElementType. 函数接口定义: ElementType Median( El ...
- python 无序列表中第k大元素_Python要求O(n)复杂度求无序列表中第K的大元素实例...
昨天面试上来就是一个算法,平时基本的算法还行,结果变个法就不会了...感觉应该刷一波Leecode冷静下...今天抽空看下. 题目就是要求O(n)复杂度求无序列表中第K的大元素 如果没有复杂度的限制很 ...
- python列表求平均值_长篇文讲解:Python要求O(n)复杂度求无序列表中第K的大元素实例...
本文内容主要介绍了Python要求O(n)复杂度求无序列表中第K的大元素实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧! 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法 ...
- pta求阶乘序列前n项和_序列问题总结-超级巧妙
最近发现两个题目,用栈解决非常精巧,特此分享: leetcode456: 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j ...
- python中属于无序序列的有_Python字典和集合属于无序序列。(2.0分)_学小易找答案...
[单选题]某公司成立十年来,每年都要组织公司学习公司创始人创办初期事迹的活动,以提炼升华公司精神,这种组织员工学习文化的做法,利用的是( )? [判断题]元组没有append().remove()等方 ...
- 求连续序列的最大子序列和
求一个序列的最大子序列和,这个可以有几种方法都可以去求解,这里我提供两种方法给大家. 假如这个序列是{1,-2,3,4},显然最大子序列和是7,那么这个要怎么去计算呢? 第一种方法就是顺序求取,可以先 ...
最新文章
- SQL与NoSQL区别-读写性能
- R语言为dataframe添加新的数据列(横向拼接、Appending columns,Unioning columns):使用R原生方法、data.table、dplyr等方案
- 想进大厂?Dubbo 普普通通 9 问你知道吗
- GIS数据格式:Geodatabase
- 除了CRUD也要注意IO
- Java类加载的那些事
- DOS状态下可以安装Win XP
- 中科大少年班目前为止出过多少大牛?
- hid编程 qt_hidapi-0.7.0 OS Develop 操作系统开发 240万源代码下载- www.pudn.com
- 加拿大生信开源学习资源Bioinformatics.ca
- vue2.0中watch总结:普通监听和深度监听
- Know more about Oracle Latches
- 计算机报警声 一高一低,有报警声电脑问题怎么处理 有报警声电脑问题处理方法【介绍】...
- python datetime.datetime.now_python时间日期datetime模块
- STM32F1移植到STM32F407 (LD3320)
- 选用什么云服务器做编程学习比较好?
- 自媒体平台搜狗号登陆 搜狗挑战百度、头条有胜算吗?
- 手机水星路由器服务器无响应,水星路由器无线wifi连接成功但上不了网的解决方法...
- Android学习教程之idea和海马玩模拟器搭建调试
- 微软ad域服务器 管理用户,威联通NAS助企业解决Windows AD域账户管理