2014-10-30 136 views
1

我在C++中使用了Armadillo庫。C++犰狳:最近的鄰居

假設我有一個n×1列矩陣,它按數字順序排序。例如

mat X; X.randn(100,1); 
mat X_sorted; X_sorted = sort(X); 
cout << X_sorted << endl; 

,並假設我有一個變量

double y = 0.5; 

我想:是找到指數,zx_sorted,爲此x_sorted(z)最接近爲y的一種方式。如果是領帶(這在我的情況中並不重要),只需選擇較大的那個。這樣做的

回答

1

一種方法是這樣的:

int z = as_scalar(sort_index(abs(X_sorted - y)).row(0)); 

請隨意批評這個解決方案,並提出改善。

下面是它的一個示例程序在行動:

int main(int argc, char** argv) 
{ 
using namespace arma; 
using namespace std; 

mat X; X.randn(100,1); 
mat X2; X2.zeros(100,1); 
for(int i=0; i<100; i++){X2(i) = i;} 
mat X_sorted; X_sorted = sort(X); 

mat XX; XX=join_rows(X2,X_sorted); 
cout << XX << endl; 

double y = 0.5; 
int z = as_scalar(sort_index(abs(X_sorted - y)).row(0)); 
mat XX_z; XX_z = XX.row(z); 
cout << XX_z << endl; 

return 0; 
} 
+1

解決方案必須在一個單一的線是優雅。但它不具有最佳的漸近時間複雜度。比較數組中的每個值與變量的漸近時間複雜度爲「O(n)」。二進制搜索將具有漸近時間複雜度「O(log(n))」。 – Svaberg 2015-10-18 21:36:56