在python3中實(shí)現(xiàn)查找數(shù)組中最接近與某值的元素操作
我就廢話不多說了,直接上代碼吧!
import datetime
def find_close(arr, e):
start_time = datetime.datetime.now()
size = len(arr)
idx = 0
val = abs(e - arr[idx])
for i in range(1, size):
val1 = abs(e - arr[i])
if val1 < val:
idx = i
val = val1
use_time = datetime.datetime.now() - start_time
return arr[idx], use_time.seconds * 1000 + use_time.microseconds / 1000
def find_close_fast(arr, e):
start_time = datetime.datetime.now()
low = 0
high = len(arr) - 1
idx = -1
while low <= high:
mid = int((low + high) / 2)
if e == arr[mid] or mid == low:
idx = mid
break
elif e > arr[mid]:
low = mid
elif e < arr[mid]:
high = mid
if idx + 1 < len(arr) and abs(e - arr[idx]) > abs(e - arr[idx + 1]):
idx += 1
use_time = datetime.datetime.now() - start_time
return arr[idx], use_time.seconds * 1000 + use_time.microseconds / 1000
if __name__ == "__main__":
arr = []
f = open("1Mints.txt")
for line in f:
arr.append(int(line))
f.close()
arr.sort()
while 1:
e = int(input("input a number:"))
print("find_close ", find_close(arr, e))
print ("find_close_fast ", find_close_fast(arr, e))
補(bǔ)充拓展:查詢集合中最接近某個(gè)數(shù)的數(shù)
查詢集合中最接近某個(gè)數(shù)的數(shù)
/*
★實(shí)驗(yàn)任務(wù)
給你一個(gè)集合,一開始是個(gè)空集,有如下兩種操作:
向集合中插入一個(gè)元素。
詢問集合中最接近某個(gè)數(shù)的數(shù)是多少。
★數(shù)據(jù)輸入
輸入第一行為一個(gè)正整數(shù) N,表示共有 N 個(gè)操作。
接下來 N 行,每行一個(gè)操作。
對于第一個(gè)操作,輸入格式為 1 x,表示往集合里插入一個(gè)值為 x 的元素。
對于第二個(gè)操作,輸入格式為 2 x,表示詢問集合中最接近 x 的元素是什么。
1<=N<=100000,1<=x<=1000000000。
★數(shù)據(jù)輸出
對于所有的第二個(gè)操作,輸出一個(gè)或者兩個(gè)整數(shù),表示最接近 x 的元素,有
兩個(gè)數(shù)的情況,按照升序輸出,并用一個(gè)空格隔開。
如果集合為空,輸出一行“Empty!”
數(shù)據(jù)保證插入的元素兩兩不同。
輸入示例 輸出示例
5 Empty!
2 1 2
1 2 2 4
2 3
1 4
2 3
*/
解題思路
一、采用C++ 中map容器,因?yàn)樗梢詫?shí)時(shí)對輸入的元素進(jìn)行排序。(map的使用可自行百度)
二、當(dāng)集合為空時(shí),輸出“Empty!”;當(dāng)集合中只有一個(gè)元素時(shí),直接輸出該元素。
三、下面重點(diǎn)看一般的情況。
1.先查找集合中是否有查詢的元素,有則輸出該元素
2.沒有的話,將該元素先插入集合中,再查找該元素處于集合的某個(gè)位置。
若該元素在集合的首位,則輸出該數(shù)的下一位。
若該元素在集合的末位,則輸出該數(shù)的上一位。
否則,判斷它左右元素的值與它的差的絕對值,輸出差的絕對值較小的那個(gè)元素。若相等,則同時(shí)輸出。
#include <iostream>
#include <map>
#include <cmath>
using namespace std;
map <long long ,int> a;
int main()
{
a.clear() ;
int N,t;
long long int x;
cin >> N;
while(N--)
{
cin >> t >> x;
if(t==1)
a[x]=1;
else
{
if(a.empty() )//判斷集合是否為空
cout << "Empty!\n" ;
else
{
if(a.size() == 1 )//若只有一個(gè)元素,則直接輸出
cout << a.begin()->first << endl;
else
{
map <long long ,int>::iterator it,m,n;
it=a.find(x);
if(it!=a.end() )
{
cout << x <<endl;
continue;
}
a[x]=1;
it=a.find(x);
if(it == a.begin() )
{
it++;
cout << it -> first << endl;
}
else if(it == a.end() )
{
it--;
cout << it -> first << endl;
}
else
{
m=--it;//m和n分別指向it的左右兩側(cè)
it++;
n=++it;
if(abs(m -> first - x) > abs(n -> first - x))
cout << n -> first << endl;
else if(abs(m -> first - x) == abs(n -> first - x))
cout << m -> first << " " << n -> first << endl;
else
cout << m -> first << endl;
}
a.erase(a.find(x) );
}
}
}
}
return 0;
}
以上這篇在python3中實(shí)現(xiàn)查找數(shù)組中最接近與某值的元素操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)將Excel轉(zhuǎn)換為json的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)將Excel轉(zhuǎn)換為json的方法,涉及Python文件讀寫及格式轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
對Python中g(shù)ensim庫word2vec的使用詳解
今天小編就為大家分享一篇對Python中g(shù)ensim庫word2vec的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
python 系統(tǒng)調(diào)用的實(shí)例詳解
這篇文章主要介紹了python 系統(tǒng)調(diào)用的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07
Python操作MySQL數(shù)據(jù)庫的基本方法(查詢與更新)
在工作中我們需要經(jīng)常對數(shù)據(jù)庫進(jìn)行操作,比如 Oracle、MySQL、SQL Sever等,這篇文章主要給大家介紹了關(guān)于Python操作MySQL數(shù)據(jù)庫的基本方法包括了數(shù)據(jù)查詢與數(shù)據(jù)更新(新增、刪除、修改),需要的朋友可以參考下2023-09-09
python enumerate函數(shù)的使用方法總結(jié)
這篇文章主要介紹了python enumerate使用方法總結(jié),enumerate函數(shù)用于遍歷序列中的元素以及它們的下標(biāo),有興趣的可以了解一下2017-11-11
django inspectdb 操作已有數(shù)據(jù)庫數(shù)據(jù)的使用步驟
這篇文章主要介紹了django inspectdb 操作已有數(shù)據(jù)庫數(shù)據(jù)的使用步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02

