搜索算法实现 - Golang版

简介: 搜索算法实现 - Golang版

算法列表

算法实现

顺序查找(Sequential Search)

funcSequentialSearch(array []int, targetint) int {
ifarray==nil||len(array) ==0 {
return-1    }
fori :=0; i<len(array); i++ {
ifarray[i] ==target {
returni        }
    }
return-1}

二叉树查找(Binary Search)

基本二分查找

funcBinarySearch(array []int, targetint) int {
ifarray==nil||len(array) ==0 {
return-1    }
low :=0high :=len(array) -1mid :=0forlow<=high {
//mid = low + (high-low)/2mid=low+ (high-low)>>1ifarray[mid] >target {
high=mid-1        } elseifarray[mid] <target {
low=mid+1        } else {
returnmid        }
    }
return-1}

二分查找第一个元素的位置

funcLowerBound(array []int, targetint) int {
low, high, mid :=0, len(array)-1, 0forlow<=high {
//mid = low + (high-low)/2mid=low+ (high-low)>>1ifarray[mid] >=target {
high=mid-1        } else {
low=mid+1        }
    }
returnlow}

二分查找第一个大于该元素的位置

funcUpperBound(array []int, targetint) int {
low, high, mid :=0, len(array)-1, 0forlow<=high {
//mid = low + (high-low)/2mid=low+ (high-low)>>1ifarray[mid] >target {
high=mid-1        } else {
low=mid+1        }
    }
returnlow}

三叉树查找(Ternary Search)

funcTernarySearch(array []int, targetint) int {
ifarray==nil||len(array) ==0 {
return-1    }
low, high :=0, len(array)-2mid1, mid2 :=0, 0forlow<=high {
mid1=low+ (high-low)/3mid2=high+ (high-low)/3ifarray[mid1] ==target {
returnmid1        } elseifarray[mid2] ==target {
returnmid2        }
iftarget<array[mid1] {
high=mid1-1        } elseiftarget>array[mid2] {
low=mid2+1        } else {
low=mid1+1high=mid2-1        }
    }
return-1}

插值查找(Interpolation Search)

funcInterpolationSearch(array []int, targetint) int {
ifarray==nil||len(array) ==0 {
return-1    }
low, high :=0, len(array)-1varmid=0forarray[low] <target&&array[high] >target {
//mid = low + (high-low)/2mid=low+ (high-low)>>1ifarray[mid] <target {
low=mid+1        } elseifarray[mid] >target {
high=mid-1        } else {
returnmid        }
    }
ifarray[low] ==target {
returnlow    } elseifarray[high] ==target {
returnhigh    } else {
return-1    }
}

斐波那契查找(Fibonacci Search)

在是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。注意同时属于一种有序查找算法

// FibonacciSearch 斐波那查找funcFibonacciSearch(array []int, targetint) int {
ifarray==nil||len(array) ==0 {
return-1    }
high :=len(array) -1max :=array[high]
fibMMm2 :=0// (m-2)'th Fibonacci No.fibMMm1 :=1// (m-1)'th Fibonacci No.fibM :=fibMMm2+fibMMm1// m'th FibonacciforfibM<max {
fibMMm2=fibMMm1fibMMm1=fibMfibM=fibMMm2+fibMMm1    }
varmid, offset=0, -1forfibM>1 {
mid=algorithm.Min(offset+fibMMm2, high)
ifarray[mid] <target {
fibM=fibMMm1fibMMm1=fibMMm2fibMMm2=fibM-fibMMm1offset=mid        } elseifarray[mid] >target {
fibM=fibMMm2fibMMm1=fibMMm1-fibMMm2fibMMm2=fibM-fibMMm1        } else {
returnmid        }
    }
ifoffset<high&& (array[offset+1] ==target) {
returnoffset+1    }
return-1}
// fibonacciRecursion 递归求斐波那数// f(n) = f(n-1) + f(n-2), n >= 2funcfibonacciRecursion(nint) int {
ifn==0 {
return0    } elseifn==1 {
return1    }
returnfibonacciRecursion(n-1) +fibonacciRecursion(n-2)
}
// fibonacci 求斐波那数funcfibonacci(nint) int {
a :=0b :=1fori :=0; i<n; i++ {
temp :=aa=bb=temp+a    }
returna}

指数查找(Exponential Search)

funcExponentialSearch(array []int, targetint) int {
ifarray==nil||len(array) ==0 {
return-1    }
ifarray[0] ==target {
return0    }
length :=len(array)
ifarray[length-1] ==target {
returnlength-1    }
searchRange :=1forsearchRange<length&&array[searchRange] <=target {
//searchRange = searchRange * 2searchRange=searchRange<<1    }
//startIndex := searchRange / 2startIndex :=searchRange>>1endIndex :=algorithm.Min(searchRange, length)
bi :=BinarySearch(array[startIndex:endIndex], target)
ifbi==-1 {
return-1    } else {
returnbi+startIndex    }
}

树表查找(Tree table lookup)


         

分块查找(Blocking Search)

funcJumpSearch(array []int, targetint) int {
ifarray==nil||len(array) ==0 {
return-1    }
length :=len(array)
step :=int(math.Sqrt(float64(length)))
prev :=0forarray[algorithm.Min(step, length)-1] <target {
prev=stepstep+=int(math.Sqrt(float64(length)))
ifprev>=length {
return-1        }
    }
forarray[prev] <target {
prev++ifprev==algorithm.Min(step, length) {
return-1        }
    }
ifarray[prev] ==target {
returnprev    }
return-1}

哈希查找(Hash Search)


目录
相关文章
|
3月前
|
算法
【算法】二分算法——搜索插入位置
【算法】二分算法——搜索插入位置
|
16天前
|
算法 搜索推荐 数据库
二分搜索:高效的查找算法
【10月更文挑战第29天】通过对二分搜索的深入研究和应用,我们可以不断挖掘其潜力,为各种复杂问题提供高效的解决方案。相信在未来的科技发展中,二分搜索将继续发挥着重要的作用,为我们的生活和工作带来更多的便利和创新。
24 1
|
1月前
|
算法 决策智能
基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数
该程序基于禁忌搜索算法求解车辆路径问题(VRP),使用MATLAB2022a版本实现,并带有GUI界面。用户可通过界面设置参数并查看结果。禁忌搜索算法通过迭代改进当前解,并利用记忆机制避免陷入局部最优。程序包含初始化、定义邻域结构、设置禁忌列表等步骤,最终输出最优路径和相关数据图表。
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
56 2
|
1月前
|
存储 算法 C++
【搜索算法】 跳马问题(C/C++)
【搜索算法】 跳马问题(C/C++)
|
1月前
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)
|
3月前
|
机器学习/深度学习 算法 文件存储
【博士每天一篇文献-算法】 PNN网络启发的神经网络结构搜索算法Progressive neural architecture search
本文提出了一种名为渐进式神经架构搜索(Progressive Neural Architecture Search, PNAS)的方法,它使用顺序模型优化策略和替代模型来逐步搜索并优化卷积神经网络结构,从而提高了搜索效率并减少了训练成本。
55 9
|
3月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
3月前
|
存储 算法 调度
基于和声搜索算法(Harmony Search,HS)的机器设备工作最优调度方案求解matlab仿真
通过和声搜索算法(HS)实现多机器并行工作调度,以最小化任务完成时间。在MATLAB2022a环境下,不仅输出了工作调度甘特图,还展示了算法适应度值的收敛曲线。HS算法模拟音乐家即兴创作过程,随机生成初始解(和声库),并通过选择、微调生成新解,不断迭代直至获得最优调度方案。参数包括和声库大小、记忆考虑率、音调微调率及带宽。编码策略将任务与设备分配映射为和声,目标是最小化完成时间,同时确保满足各种约束条件。
|
4月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
119 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
下一篇
无影云桌面