python - 如何实现四元搜索?

标签 python algorithm search binary-search

我知道这个算法并不比二分查找好,但它是一个理解递归的有趣的思想实验。不过,我在这方面还没有走得太远(我的大脑无法处理太多的递归。)。有人知道如何实际实现吗?

我有以下内容,但远不正确。我什至不知道如何处理这个问题,这就像盗梦空间的搜索版本。

def srb(list,key,q1,q2,q3,q4):
    mid1 = (q1+q2)//2
    mid2 = (q3+q4)//2
    if mid1 < list[0] or mid1 > list[-1] or key < list[0] or key > list[-1]:
        return False
    if mid2 < list[0] or mid2 > list[-1] or key < list[0] or key > list[-1]:
        return False
    elif key == mid1 or key == mid2:
        return True
    elif key > mid1 and key < q3:
        return srb(list,key,mid1+1,q2)
    elif key < mid1:
        return srb(list,key,q1,mid1-1)
    elif key > q3 and key < mid2:
        return srb(list,key,q3+1,mid2)
    else:
        return srb(list,key,mid2+1,q4)

最佳答案

这个解决方案怎么样?

#start = 0
#first_quarter = int(len(a_list)/4) - 1
#mid_point = int(len(a_list)/2) - 1
#third_quarter = int(len(a_list)*3/4) - 1
#end = len(a_list) - 1

def search(a_list, elem):
    return search_recur(a_list, elem, *generate_quartets(a_list, 0))

def generate_quartets(a_list, start):
    return [x + start for x in [0, int(len(a_list)/4) - 1 , int(len(a_list)/2) - 1,
                int(len(a_list)*3/4) - 1, len(a_list) - 1]]

def search_recur(a_list, elem, start, first_quarter, mid_point, third_quarter, end):
    #print(a_list)
    if not a_list:
        return -1

    list_of_quartets = [start, first_quarter, mid_point, third_quarter, end]

    try:
        ind = [a_list[x] for x in list_of_quartets].index(elem)
        return list_of_quartets[ind]
    except:
        pass

    if (a_list[start] < elem < a_list[first_quarter]):
        return search_recur(a_list, elem, *generate_quartets(a_list[start+1:first_quarter], start+1))
    elif (a_list[first_quarter] < elem < a_list[mid_point]):
        return search_recur(a_list, elem, *generate_quartets(a_list[first_quarter+1:mid_point], first_quarter+1))
    elif (a_list[mid_point] < elem < a_list[third_quarter]):
        return search_recur(a_list, elem, *generate_quartets(a_list[mid_point+1:third_quarter], mid_point+1))
    elif (a_list[third_quarter] < elem < a_list[end]):
        return search_recur(a_list, elem, *generate_quartets(a_list[third_quarter+1:end], third_quarter+1))
    else:
        return -1



print(search([1,2,3,4], 4))
print(search([10, 12, 14, 17, 19, 20], 4))
print(search([10, 12, 14, 17, 19, 20], 17))
print(search([9, 15, 22, 35, 102, 205, 315, 623], 22))
print(search([9, 15, 22, 35, 102, 205, 315, 623], 35))
print(search([9, 15, 22, 35, 102, 205, 315, 623], 102))

输出-

3
-1
3
2
3
4

关于python - 如何实现四元搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39901240/

相关文章:

python - Python 中的随机最优控制问题

c - 将冲突键哈希到哈希表中的下一个

algorithm - 是否有任何已知的算法以最有效的方式用不同大小的矩形填充特定区域?

javascript - 如何在 JavaScript 中将模式与数组进行匹配?

search - Vim:如何在同一搜索中搜索多个单词?

python - 使用 scapy、iftop 样式计算每个 IP 的带宽使用情况

python - 在开发 Python 模块时使用绝对导入?

python - 文件打开并写入,无法获取要执行的异常路径

调整网络边缘权重的算法(最好在相关的 Matlab 工具箱上推荐)

MySQL - 如何执行此字符串搜索?