資料結構之查詢 基於線性表的查詢法

2021-08-19 20:15:02 字數 4219 閱讀 7462

用所給的元素與列表的中的各個元素進行比較,若相等返回索引,否則返回錯誤資訊。

假設列表長度為

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...