Python 使用字符串进行二进制搜索的输出不正确
我有一个典型的二进制搜索算法实现:Python 使用字符串进行二进制搜索的输出不正确,python,Python,我有一个典型的二进制搜索算法实现: def binarySearch(arr, element): first = 0 last = len(arr) - 1 while first <= last: i = (first + last) // 2 if arr[i] == element: return 'Found at position: {}'.format(i) elif arr[i]
def binarySearch(arr, element):
first = 0
last = len(arr) - 1
while first <= last:
i = (first + last) // 2
if arr[i] == element:
return 'Found at position: {}'.format(i)
elif arr[i] > element:
last = i - 1
elif arr[i] < element:
first = i + 1
当我调用binarySearch()
函数时,如下所示:
element = '002E1627'
print (binarySearch(arr, element))
我得到的输出是:
Found at position: 5
None
但是,通过以下输入:
element = '002a'
print (binarySearch(arr, element))
我得到的输出是:
Found at position: 5
None
这一输出背后的原因是什么
第二种情况的预期输出是:
位于位置:4
问题是二进制搜索仅适用于排序的数组/列表
由于字符a
位于字符E
之后(小写总是位于大写字母之后),因此您的列表根本没有排序
清单应为:
arr = ['0006', '000e', '000f', '0023', '002E1627', '002a', '0032A542', '0037']
然后您将获得所需的输出。问题是,二进制搜索仅适用于已排序的数组/列表 由于字符
a
位于字符E
之后(小写总是位于大写字母之后),因此您的列表根本没有排序
清单应为:
arr = ['0006', '000e', '000f', '0023', '002E1627', '002a', '0032A542', '0037']
然后,您将获得所需的输出只需转换为一种情况:
def binarySearch(arr, element):
first = 0
last = len(arr) - 1
while first <= last:
i = (first + last) // 2
if arr[i].upper() == element.upper():
return 'Found at position: {}'.format(i)
elif arr[i].upper() > element.upper():
last = i - 1
elif arr[i].upper() < element.upper():
first = i + 1
element = '002a'
print (binarySearch(arr, element))
Found at position: 4
def二进制搜索(arr,元素):
第一个=0
最后一个=长度(arr)-1
而第一个元素。upper():
last=i-1
elif arr[i].upper()
只需转换为单个案例:
def binarySearch(arr, element):
first = 0
last = len(arr) - 1
while first <= last:
i = (first + last) // 2
if arr[i].upper() == element.upper():
return 'Found at position: {}'.format(i)
elif arr[i].upper() > element.upper():
last = i - 1
elif arr[i].upper() < element.upper():
first = i + 1
element = '002a'
print (binarySearch(arr, element))
Found at position: 4
def二进制搜索(arr,元素):
第一个=0
最后一个=长度(arr)-1
而第一个元素。upper():
last=i-1
elif arr[i].upper()
您的输入列表未排序。您的数据必须排序才能进行二进制搜索。你的不是(002a
应该在002E1627
之后)。这应该是十六进制而不是字符串吗?给我的数据是字符串格式的。我确实考虑过这个格式是不是引起了搜索的问题。你的测试<代码> ARR 长度是4或8个长度,是领先的<代码> 0 /代码>,看起来是十六进制。如果您使用的是16位和32位地址或整数,了解这些信息将非常有用。提供给你的规格,你会得到更好的回答。混合长度也有点奇怪。您的输入列表未排序。您的数据必须排序才能进行二进制搜索。你的不是(002a
应该在002E1627
之后)。这应该是十六进制而不是字符串吗?给我的数据是字符串格式的。我确实考虑过这个格式是不是引起了搜索的问题。你的测试<代码> ARR 长度是4或8个长度,是领先的<代码> 0 /代码>,看起来是十六进制。如果您使用的是16位和32位地址或整数,了解这些信息将非常有用。提供给你的规格,你会得到更好的回答。混合长度也有点奇怪。所以,我们根据ASCII值进行排序?我记得python 2.x是ASCII,3.0以后是Unicode,但在任何情况下(Unicode或ASCII)小写紧跟在大写之后不适合排序。特别是每次调用,如果OP最终有一个巨大的列表。最好折叠成一个大小写。因此,我们根据ASCII值进行排序?我记得python 2.x是ASCII,3.0以后是Unicode,但在任何情况下(Unicode或ASCII)小写紧跟在大写之后不适合排序。特别是每次调用,如果OP最终有一个巨大的列表。最好合并到一个案例中。这个解决方案虽然有效,但并不总是适用。在有些情况下,小写/大写很重要,代码可以变得更有效,特别是如果您可以将arr
一劳永逸地单独使用。liikewise,单个案例元素
每次调用binarySearch
@zion只要它对OP有效,现实世界的用例就分为“先上后下”和“折叠”两种。此外,还需要一条规则来解决仅因大小写不同而不同的相同拼写之间的联系。应该由需求决定,而不是任何特定编程语言的并置顺序。@ShpielMeister事实上,数据集是一个包含100000多个元素的数组。您认为将所有条目转换为小写更好吗?取决于使用次数。更重要的是,这些数据代表什么?正如所提到的案例的重要性一样。为了回答您的问题,在这种情况下,将数组全部转换为一种情况似乎是合理的。这种解决方案虽然有效,但并不总是适用。在有些情况下,小写/大写很重要,代码可以变得更有效,特别是如果您可以将arr
一劳永逸地单独使用。liikewise,单个案例元素
每次调用binarySearch
@zion只要它对OP有效,现实世界的用例就分为“先上后下”和“折叠”两种。此外,还需要一条规则来解决仅因大小写不同而不同的相同拼写之间的联系。应该由需求决定,而不是任何特定编程语言的并置顺序。@ShpielMeister事实上,数据集是一个包含100000多个元素的数组。您认为将所有条目转换为小写更好吗?取决于使用次数。更重要的是,这些数据代表什么?正如所提到的案例的重要性一样。为了回答您的问题,在这种情况下,将数组全部转换为一种情况似乎是合理的。