求无序序列每个元素最接近的值
生活随笔
收集整理的這篇文章主要介紹了
求无序序列每个元素最接近的值
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、問題描述
給一個n個元素的線性表A,對于每個數(shù)Ai,找到它之前的數(shù)中,和它最接近的數(shù)。
即對于每個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 ] 之前的數(shù)中與 A[ i ]最接近的。然后 將A[i] 從L中刪去。則雙向鏈表中剩下的元素就是 A[i] 前面的元素。這種方法的效率可以達到O(nlogn)。
1.3 算法過程圖解
1.4 思路2算法實現(xiàn)
首先,需要的一個雙向鏈表作為輔助,定義雙向鏈表結構如下:
struct LNode{struct LNode* next;struct LNode* prev;int key; };給鏈表添加一些操作,來支持解決問題: #include <stdio.h> #include <malloc.h> #include "lcl.h"//從數(shù)組里創(chuàng)建鏈表 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) //創(chuàng)建第一個結點時執(zhí)行 {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為計數(shù)起點,一般是0,r為數(shù)組最后序號,為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);} }
附錄:
1、代碼
2、參考教程
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結
以上是生活随笔為你收集整理的求无序序列每个元素最接近的值的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C语言】%e,用科学计数法输出
- 下一篇: python requests 重试_我