在两个方向上寻找搜索算法 - c / c ++ / awk
Looking for Search algorithm in both direction - c / c++ / awk
我正在做一些计算建模,其中我需要搜索间隔不规则且数据未排序的数据,所以这是场景
我的示例数据点
col1 col2
1 92
9 45
7 22
2 14
5 10
所以我正在寻找的搜索算法是这样的,
假设如果key = 2
那么函数应该返回2
的索引,因为它可用,例如我想搜索3
,它在col1
中不存在,因为它不可用,我需要在两个方向上搜索最近的值,即2
和5
的索引
如果是这样的话awk
确切的键可以使用这样的东西进行搜索
function search(Arr,key){
if((key in Arr))
return key
}
但我真的不知道,但在上下方向搜索最近的值,以防找不到确切的键
我希望我的要求是明确的,如果投反对票,也请发表您的评论,因为我的问题是因为声誉较低(本论坛新手),我无法投票获得有用的答案,请合作。
壳解决方案,
perl -lane'
BEGIN{ $k=pop }
push @r, [@F];
END {
for (sort{ $a->[0] <=> $b->[0] } @r) {
$v= $_->[0] <=> $k;
$h{$v} = $_->[1];
last if $v >0;
}
print join " ", ($h{0} or @h{-1,1});
}
' file 3
输出
14 10
因为没有排序,所以最好是同时搜索精确、下限和上限,只遍历一次数据。
#include <iostream>
#include <vector>
#include <utility>
using Samples = std::vector<std::pair<int,int>>;
Samples::const_iterator Find( Samples const & samp_, int val_, Samples::const_iterator & prev_, Samples::const_iterator & next_ ) {
auto end = std::end(samp_);
auto lower = end;
auto upper = end;
auto it = begin(samp_);
for( ; it!=end; ++it) {
if ( it->first == val_ )
return it;
if ( it->first < val_ && ( lower == end || lower->first < it->first ) )
lower = it;
else if ( it->first > val_ && ( upper == end || upper->first > it->first ) )
upper = it;
}
prev_ = lower;
next_ = upper;
return end;
}
std::ostream & operator<<( std::ostream & os, std::pair<int,int> const & p ) {
return os << "( " << p.first << ", " << p.second << " )";
}
int main() {
Samples samps { {1,92}, {9,45},{7,22},{2,14},{5,10} };
auto test = [&] ( int v ) {
Samples::const_iterator lower;
Samples::const_iterator upper;
auto result = Find( samps, v, lower, upper );
if ( result != end( samps ) ) {
std::cout << "found " << *result << std::endl;
} else {
std::cout << "not found ";
if ( lower != end( samps ) )
std::cout << "lower is " << *lower;
else
std::cout << "no lower";
if ( upper != end( samps ) )
std::cout << " upper is " << *upper;
else
std::cout << " no upper";
std::cout << std::endl;
}
};
test(2);
test(3);
test(12);
test(-1);
}
结果是:
found ( 2, 14 )
not found lower is ( 2, 14 ) upper is ( 5, 10 )
not found lower is ( 9, 45 ) no upper
not found no lower upper is ( 1, 92 )
在 Gnu Awk 版本 4 中,你可以使用如下PROCINFO["sorted_in"]
:
gawk -vkey=7 -f a.awk file
其中a.awk
是:
{
a[$1]=$2
}
END {
if (key in a)
print "Found key "key" with value "a[key]
else {
PROCINFO["sorted_in"]="@ind_num_asc"
for (i in a) {
if (i+0>key) { k=i; break}
j=i
}
if (j)
print "Prev key: "j
if(k)
print "Next key: "k
}
}
输出:
$gawk -vkey=6 -f a.awk file
Prev key: 5
Next key: 7
$gawk -vkey=5 -f a.awk file
Found key 5 with value 10
相关文章:
- std::unordered_map 搜索算法是如何实现的?
- C++线性搜索算法,确定数组中元素的数量
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 尝试实现二叉搜索算法,似乎无法使其工作
- 图上的深度优先搜索算法中的内存泄漏
- 使用图形的字符串搜索算法?C++
- 使用 while 循环和搜索算法进行复制
- C++ 循环和搜索算法,重复
- 了解一种神秘地起作用的递归二进制搜索算法
- 双二叉搜索算法
- 修改广度优先搜索算法以记住矩阵中的最短路径
- C 搜索算法第一个数字= n
- 如何在较高和较低数字的阵列中适应搜索算法(3N / 2)-2
- 需要矩阵搜索算法
- C++搜索算法-处理海量数据
- 从给定的 IPv6:端口列表中搜索 IPv6:端口组合的最快搜索算法是什么 O(1) 时间一致性
- 在两个方向上寻找搜索算法 - c / c ++ / awk
- 质数搜索算法(两种不同的算法)和Prime表的使用
- 带有字符串数组的二叉搜索算法