搜索算法实现 - 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)


目录
相关文章
|
2月前
|
算法
【算法】二分算法——搜索插入位置
【算法】二分算法——搜索插入位置
|
4月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
40 4
|
8天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
26 2
|
2月前
|
机器学习/深度学习 算法 文件存储
【博士每天一篇文献-算法】 PNN网络启发的神经网络结构搜索算法Progressive neural architecture search
本文提出了一种名为渐进式神经架构搜索(Progressive Neural Architecture Search, PNAS)的方法,它使用顺序模型优化策略和替代模型来逐步搜索并优化卷积神经网络结构,从而提高了搜索效率并减少了训练成本。
39 9
|
2月前
|
算法
【算法】递归、搜索与回溯——汉诺塔
【算法】递归、搜索与回溯——汉诺塔
|
2月前
|
存储 算法 调度
基于和声搜索算法(Harmony Search,HS)的机器设备工作最优调度方案求解matlab仿真
通过和声搜索算法(HS)实现多机器并行工作调度,以最小化任务完成时间。在MATLAB2022a环境下,不仅输出了工作调度甘特图,还展示了算法适应度值的收敛曲线。HS算法模拟音乐家即兴创作过程,随机生成初始解(和声库),并通过选择、微调生成新解,不断迭代直至获得最优调度方案。参数包括和声库大小、记忆考虑率、音调微调率及带宽。编码策略将任务与设备分配映射为和声,目标是最小化完成时间,同时确保满足各种约束条件。
|
3月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
2月前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
|
3月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
【7月更文挑战第19天】Trie树,又称前缀树,是优化字符串搜索的高效数据结构。通过利用公共前缀,Trie树能快速插入、删除和查找字符串。
84 2
|
3月前
|
机器学习/深度学习 数据采集 算法
Python实现GBDT(梯度提升树)分类模型(GradientBoostingClassifier算法)并应用网格搜索算法寻找最优参数项目实战
Python实现GBDT(梯度提升树)分类模型(GradientBoostingClassifier算法)并应用网格搜索算法寻找最优参数项目实战
113 3
下一篇
无影云桌面