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、参考教程

求无序序列每个元素最接近的值相关推荐

  1. 算法--微软面试题:求一个整数数组元素间最小差值

    Q题目 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数. A解法 方案一:最愚笨的办法--暴力穷举 利用数组中所有数据两两相减的对比来求出这个最小差值. ...

  2. 求包含n(n>1)个元素的无序序列中第k小的元素。

    求包含n[n>1]个元素的无序序列中第k小的元素. 题目描述 C++程序答案 题目描述 [问题描述] 编写一个实验程序,利用STL中的priority_queue(优先队列)求出包含n个元素的无 ...

  3. 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和

    原题:有一序列a,大小为n,分为2部分,序列元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小,用python写. #coding=utf- ...

  4. 求自定类型元素序列的中位数

    本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊N/2+1⌋大的元素.其中集合元素的类型为自定义的ElementType. 函数接口定义: ElementType Median( El ...

  5. python 无序列表中第k大元素_Python要求O(n)复杂度求无序列表中第K的大元素实例...

    昨天面试上来就是一个算法,平时基本的算法还行,结果变个法就不会了...感觉应该刷一波Leecode冷静下...今天抽空看下. 题目就是要求O(n)复杂度求无序列表中第K的大元素 如果没有复杂度的限制很 ...

  6. python列表求平均值_长篇文讲解:Python要求O(n)复杂度求无序列表中第K的大元素实例...

    本文内容主要介绍了Python要求O(n)复杂度求无序列表中第K的大元素实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧! 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法 ...

  7. pta求阶乘序列前n项和_序列问题总结-超级巧妙

    最近发现两个题目,用栈解决非常精巧,特此分享: leetcode456: 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j ...

  8. python中属于无序序列的有_Python字典和集合属于无序序列。(2.0分)_学小易找答案...

    [单选题]某公司成立十年来,每年都要组织公司学习公司创始人创办初期事迹的活动,以提炼升华公司精神,这种组织员工学习文化的做法,利用的是( )? [判断题]元组没有append().remove()等方 ...

  9. 求连续序列的最大子序列和

    求一个序列的最大子序列和,这个可以有几种方法都可以去求解,这里我提供两种方法给大家. 假如这个序列是{1,-2,3,4},显然最大子序列和是7,那么这个要怎么去计算呢? 第一种方法就是顺序求取,可以先 ...

最新文章

  1. SQL与NoSQL区别-读写性能
  2. R语言为dataframe添加新的数据列(横向拼接、Appending columns,Unioning columns):使用R原生方法、data.table、dplyr等方案
  3. 想进大厂?Dubbo 普普通通 9 问你知道吗
  4. GIS数据格式:Geodatabase
  5. 除了CRUD也要注意IO
  6. Java类加载的那些事
  7. DOS状态下可以安装Win XP
  8. 中科大少年班目前为止出过多少大牛?
  9. hid编程 qt_hidapi-0.7.0 OS Develop 操作系统开发 240万源代码下载- www.pudn.com
  10. 加拿大生信开源学习资源Bioinformatics.ca
  11. vue2.0中watch总结:普通监听和深度监听
  12. Know more about Oracle Latches
  13. 计算机报警声 一高一低,有报警声电脑问题怎么处理 有报警声电脑问题处理方法【介绍】...
  14. python datetime.datetime.now_python时间日期datetime模块
  15. STM32F1移植到STM32F407 (LD3320)
  16. 选用什么云服务器做编程学习比较好?
  17. 自媒体平台搜狗号登陆 搜狗挑战百度、头条有胜算吗?
  18. 手机水星路由器服务器无响应,水星路由器无线wifi连接成功但上不了网的解决方法...
  19. Android学习教程之idea和海马玩模拟器搭建调试
  20. 微软ad域服务器 管理用户,威联通NAS助企业解决Windows AD域账户管理

热门文章

  1. 华强北耳机为啥老是有人翻车?
  2. android Dialog提示框。单选项dialog,多选项dialog
  3. android 程序崩溃日记捕捉
  4. hapi和typescript构建项目(正在更新中)
  5. w ndows10电脑配置看哪里,Windows10怎么自动登录?Windows10自动登录的设置方法
  6. csv mysql_将csv的数据导入mysql
  7. 第一次接触万物接对象
  8. centos7解决火狐浏览器fash安装问题
  9. (JAVA)File类2
  10. 【OS学习笔记】十二 现代处理器的结构和特点