目录
Python算法之旅:Myelsa的Python算法之旅(高铁直达)-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信
搜索最近邻(Nearest Neighbour Search)在实际应用中有许多典型的场景,常见应用场景有:
1、电商推荐系统:在电商领域,根据用户的购买历史和偏好,通过搜索最近邻可以找到与其相似的其他用户。然后,系统可以向这些相似用户喜欢的商品进行推荐,实现个性化的购物体验。
2、医疗诊断:在医疗领域,最近邻搜索可以应用于疾病诊断。通过分析患者的症状和疾病历史,系统可以找到与其相似的患者群体,从而预测患者可能患有的疾病,为医生提供辅助诊断的依据。
3、金融风控:在金融领域,最近邻搜索可以用于风险评估。通过搜索与客户的信用记录和交易行为相似的客户群体,系统可以评估客户的信用风险,为金融机构提供决策支持。
4、图像识别:在计算机视觉领域,最近邻搜索可以应用于图像识别。通过比较图像的特征向量,系统可以找到与其相似的图像,从而实现分类识别、目标检测等任务。
5、社交网络分析:在社交网络领域,最近邻搜索可以用于社交关系分析。根据用户的社交行为和兴趣爱好,系统可以找到与其相似的用户,然后推荐相关的社交关系或内容,增强用户的社交体验。
此外,最近邻搜索还可以应用于层次聚类、基于内容的图像检索等领域。通过比较数据点的相似度,可以形成具有独特特征的聚类,或者找到与查询图像最相似的图像集合。
总的来说,搜索最近邻在各个领域都有着广泛的应用,为各种决策和推荐提供了有力的支持。随着技术的发展和数据量的增长,最近邻搜索的应用场景还将进一步拓展。
1、搜索最近邻:
1-1、Python:
- # 1.问题描述:
- # 在一个排序数组arr1中找到i,使得arr1[i]最接近目标数target_num,输出i.
- # 2.问题示例:
- # 给定排序数组arr1 = [3, 5, 6, 8, 10, 11, 24],目标数值target_num = 22,输出6,即arr1[6]最接近目标数值target_num 22.
- # 3.代码实现:
- class Solution:
- def find_closest_position(self, arr1, target_num):
- # 如果数组为空,则返回-1表示无法找到目标值位置
- if not arr1:
- return -1
- # 初始化搜索的起始和结束位置
- start, end = 0, len(arr1) - 1
- # 当起始位置加1小于结束位置时,进行二分查找
- while start + 1 < end:
- # 计算中间位置
- mid = start + (end - start) // 2
- # 根据中间值与目标值的大小关系,调整搜索范围
- if arr1[mid] < target_num:
- start = mid
- elif arr1[mid] > target_num:
- end = mid
- else:
- # 如果找到目标值,直接返回其位置
- return mid
- # 当搜索范围缩小到相邻两个元素时,比较目标值与这两个元素的差值
- # 返回差值较小的那个元素的位置
- if abs(target_num - arr1[start]) <= abs(arr1[end] - target_num):
- return start
- else:
- return end
- # 主函数
- if __name__ == '__main__':
- # 初始化数组和目标值
- arr1 = [3, 5, 6, 8, 10, 11, 24]
- target_num = 22
- # 创建Solution类的实例
- solution = Solution()
- # 输出输入的数组和目标值
- print("输入:", arr1, ",target =", target_num)
- # 调用方法并输出最接近目标值的位置
- print("输出:", solution.find_closest_position(arr1, target_num))
- # 4.运行结果:
- # 输入: [3, 5, 6, 8, 10, 11, 24] ,target = 22
- # 输出: 6
1-2、VBA:
- Rem 自定义函数,功能:搜索最近邻
- Function FindClosestPosition(arr1 As Variant, target_num As Double) As Variant
- Dim start_pos As Long ' 定义起始位置变量
- Dim end_pos As Long ' 定义结束位置变量
- Dim mid_pos As Long ' 定义中间位置变量
-
- ' 假设 arr1 是一个已排序的数组,注意,这个前提条件非常重要!
- ' 检查数组是否为空
- If IsEmpty(arr1) Or UBound(arr1) < LBound(arr1) Then
- ' 如果数组为空或没有元素,则返回-1
- FindClosestPosition = -1
- Exit Function
- End If
- ' 初始化搜索的起始和结束位置
- start_pos = LBound(arr1)
- end_pos = UBound(arr1)
- ' 检查目标值是否小于等于数组第一个元素
- If target_num <= arr1(start_pos) Then
- ' 如果是,则第一个元素的位置是最接近的
- FindClosestPosition = start_pos
- Exit Function
- End If
- ' 检查目标值是否大于等于数组最后一个元素
- If target_num >= arr1(end_pos) Then
- ' 如果是,则最后一个元素的位置是最接近的
- FindClosestPosition = end_pos
- Exit Function
- End If
- ' 使用二分查找寻找最接近目标值的位置
- While start_pos < end_pos
- ' 计算中间位置
- mid_pos = start_pos + (end_pos - start_pos) \ 2
- ' 根据中间值与目标值的大小关系,调整搜索范围
- If arr1(mid_pos) < target_num Then
- ' 如果中间值小于目标值,搜索范围调整为中间位置到结束位置
- start_pos = mid_pos + 1
- Else
- ' 如果中间值大于等于目标值,搜索范围调整为起始位置到中间位置
- end_pos = mid_pos
- End If
- Wend
- ' 当搜索范围缩小到相邻两个元素时,返回差值较小的那个元素的位置
- If Abs(target_num - arr1(start_pos)) <= Abs(target_num - arr1(end_pos - 1)) Then
- FindClosestPosition = start_pos
- Else
- FindClosestPosition = end_pos - 1
- End If
- End Function
- Rem 执行过程,功能:调用自定义函数FindClosestPosition,实现在排序数组中找到最接近目标数值的元素所在位置,在立即窗口中输出结果.
- Sub TestRun()
- Dim arr1 As Variant ' 定义排序数组
- Dim target_num As Double ' 定义目标数值
- Dim result As Variant ' 定义输出结果变量
-
- ' 初始化数组和目标值
- arr1 = Array(3, 5, 6, 8, 10, 11, 24)
- target_num = 22
- ' 调用函数并输出结果
- result = FindClosestPosition(arr1, target_num)
- ' 输出输入的数组和目标值
- Debug.Print "输入:(", Join(arr1, ", "), "),target =", target_num
- ' 输出最接近目标值的位置
- If IsNumeric(result) Then
- Debug.Print "输出:", result
- Else
- Debug.Print "输出:数组为空"
- End If
- End Sub
- '结果输出:
- '输入:( 3, 5, 6, 8, 10, 11, 24 ),target = 22
- '输出: 6
注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行TestRun程序,在立即窗口中输出结果。
2、相关文章:
Python算法之旅:Myelsa的Python算法之旅(高铁直达)-CSDN博客
个人主页:非风V非雨-CSDN博客
欢迎志同道合者一起交流学习,我的QQ:94509325/微信:



评论记录:
回复评论: