用所給的元素與列表的中的各個元素進行比較,若相等返回索引,否則返回錯誤資訊。
假設列表長度為
n n
那麼查詢第
i' role="presentation" style="position: relative;">i
i個元素時需進行n−
i+1 n−i
+1
次比較,即ci
=n−i
+1c i=
n−i+
1,又假設查詢每個資料元素的概率相等,即pi
=1/n
p i=
1/
n,則順序查詢成功的平均查詢長度為 as
lsuc
c=∑n
i=1p
ici=
(n+1
)/2 asl
succ
=∑i=
1npi
ci=(
n+1)
/2
import sys
import time
## 直接查詢
class
seqsearch
(object):
''' seqsearch 是直接查詢演算法,
使用 search方法進行查詢操作
不返回任何值,因為沒有後續的處理直接輸出即可。
'''list_a =
def__init__
(self, number1, aim1):
# 初始化操作
for item in range(number1):
self.aim = aim1
defsearch
(self):
flag = 0
for item in self.list_a:
if item == self.aim:
flag = 1
break
else:
pass
if flag == 0:
print('沒有這個數')
else:
print('找到了。')
if __name__ == '__main__':
# 幫助文字
help_info = '''
this program is for seqsearch.
how to use it! follow the example!
python seqsearch 5 3
the 5 representative will generate five numbers.
search 3
'''# 接受系統傳的引數。
command = sys.argv[0:]
# 判斷輸入是否合法。
if len(command) != 3
or'help'
in command:
print(help_info)
else:
try:
# 試圖將文字型轉化為int。
number = int(command[1])
aim = int(command[2])
except valueerror:
# 轉化失敗,提示資訊並退出。
print(help_info)
sys.exit(1)
# 一切就緒,例項化類物件。
look = seqsearch(number, aim)
time_start = time.time() # 記錄開始時間
look.search() # 呼叫查詢演算法。
time_end = time.time() # 記錄結束時間。
print('花費的時間是%f' % (time_end-time_start))
折半查詢又稱為二分法查詢,這種方法對待查詢的列表有兩個要求,一是必須採用順序儲存結構,二是必須按照關鍵字大小有序排列。
首先,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等則查詢成功,否則利用中間位置將表分為前後兩個子表,如果中間的關鍵字大於要查詢的關鍵字,則進一步查詢前子表,否則查詢後面的子表。重複以上過程直到查詢成功,或不存在為止。
平均查詢長度。假設表的長度n=
2h−1
n =2
h−
1,則相應的判定樹的深度是
h h
的滿二叉樹,h=
long
2n+1
' role="presentation" style="position: relative;">h=l
ongn
+12h
=lon
g2n+
1。又假設每個記錄查詢到的概率相等,則查詢成功時的平均查詢長度為 as
lbs=
∑ni=
1pic
i約等於
log(
n+1)
2−1 asl
bs=∑
i=1n
pici
約等於l
og2(
n+1)
−1
import sys
import time
class
binsearch
(object):
''' binsearch 是折半查詢演算法,
使用 search方法進行查詢操作
不返回任何值,因為沒有後續的處理直接輸出即可。
'''list_a =
def__init__
(self, number1, aim1):
# 初始化操作
for item in range(number1):
self.aim = aim1
defsearch
(self):
flag = 0
low = 0
high = len(self.list_a) - 1
# 獲取高位
while low < high: # 條件是不交叉
mid = int((low + high)/2) # 選擇中間位置
if self.list_a[mid] == self.aim:
flag = 1
# 找到值
break
else:
if self.list_a[mid] > self.aim:
high = mid - 1
if self.list_a[mid] < self.aim:
low = mid + 1
if flag == 0:
print('找不到哇哇')
if flag == 1:
print('找到了啊')
if __name__ == '__main__':
# 幫助文字
help_info = '''
this program is for binarysearch.
how to use it! follow the example!
python binsearch 5 3
the 5 representative will generate five numbers.
search 3
'''# 接受系統傳的引數。
command = sys.argv[0:]
# 判斷輸入是否合法。
if len(command) != 3
or'help'
in command:
print(help_info)
else:
try:
# 試圖將文字型轉化為int。
number = int(command[1])
aim = int(command[2])
except valueerror:
# 轉化失敗,提示資訊並退出。
print(help_info)
sys.exit(1)
# 一切就緒,例項化類物件。
look = binsearch(number, aim)
time_start = time.time() # 記錄開始時間
look.search() # 呼叫查詢演算法。
time_end = time.time() # 記錄結束時間。
print('花費的時間是%f' % (time_end-time_start))
資料結構之線性表的查詢
話不多說,直接上 1 include stdafx.h 2 include3 using namespace std 4 define maxsize 10056 int f 100 7 8 無哨兵順序查詢,a為陣列,n為要查詢的陣列個數,key為要查詢的關鍵字 9int sequential se...
查詢 基於線性表
1 順序查詢 對於乙個無序的,即關鍵字沒有排序的線性表來說,用所給的關鍵字與線性表中的所有記錄逐個進行比較,直到成功或者失敗。平均查詢長度 asl n 1 2 ii 最近最少使用法 lur 也叫作移至前端法,如果找到一條記錄就把他移至線性表的最前面,而把其他記錄後退乙個位置。顯然,這種方式使用鍊錶來...
資料結構 線性表的查詢技術
include using namespace std const int maxsize 100 class linesearch 析構函式為空 intseqsearch int k 順序查詢 intbinsearch1 int k 折半非遞迴查詢 intbinsearch2 int low,in...