日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 求无序序列每个元素最接近的值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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







創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的求无序序列每个元素最接近的值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。