• Tidak ada hasil yang ditemukan

SEARCHING

N/A
N/A
Protected

Academic year: 2024

Membagikan "SEARCHING"

Copied!
22
0
0

Teks penuh

(1)

SEARCHING

(2)

!

ขอมูลที่เก็บไวประกอบดวย

– คีย (Key)

– ขอมูลที่เกี่ยวของกับคีย

!

การคนขอมูล

– ที่เก็บในหนวยความจํ าหลัก ( internal search )

– ที่เก็บในหนวยความจํ าสํ ารอง ( external search )

!

การคนแบบลํ าดับ ( sequential search )

!

การคนแบบทวิภาค ( binary search )

การคนขอมูล ( Searching )

(3)

Sequential Search

typedef int KeyType;

typedef struct ItemTag { KeyType key;

char Name[30];

...

} ItemType;

typedef struct ListTag { int count;

ItemType data[ MAX ];

} ListType;

int SeqSearch( ListType pList, KeyType TargetKey ) {

int loc;

for ( loc=0; loc<pList->count; loc++ )

31115 31316 31585 31745 42515 22245 51815 21915

สมหวัง สมนึก สมบูรณ

สมใจ สมศักดิ์

สมปอง สมเกียรติ

สมหมาย

0 1 2 3 4 5 6 7

(4)

Sequential Search

typedef struct NodeTag { ItemType data;

struct NodeTag *pNext;

} NodeType;

typedef struct ListTag;

NodeTag *pHeader;

} ListType;

NodeType *SeqSearch( ListType *pList, KeyType TargetKey ) {

NodeType *pLoc;

for ( pLoc=pList->pHeader; ploc!=NULL; ploc=pLoc->pNext )

31316

31585 31745

42515 22245

51815 21915

สมนึก

สมบูรณ สมใจ

สมศักดิ์ สมปอง

สมเกียรติ สมหมาย

31115 สมหวัง

(5)

Analysis of Sequential Search

!

จํ านวนครั้งในการเปรียบเทียบคียระหวางการคน เปนปจจัยในการ วิเคราะหเวลาในการคนขอมูล

!

สมมติใหมีขอมูล n ตัว

ถาหาคียที่ตองการไมพบ ตองมีการเปรียบเทียบ n ครั้ง ถาหาคียที่ตองการพบ

จํ านวนการเปรียบเทียบขึ้นกับตํ าแหนงของขอมูล

ใหความนาจะเปนในการคนขอมูลแตละตัวมีโอกาสเทากัน

1+2+3+...+n 0.5n(n+1)

= 0.5(n+1)

n = n

(6)

การคนแบบทวิภาค ( Binary Search)

31115 31316 31585 31745 42515 22245

51815 21915

สมหวัง สมนึก สมบูรณ

สมใจ สมศักดิ์

สมปอง

สมเกียรติ

สมหมาย

0 1 2 3 4 5 6 7

ตองการทราบชื่อของรหัส 31745 จะมีการเปรียบเทียบขอมูล 2 ครั้ง สังเกตุวาขอมูลจะตองถูกเก็บในลักษณะที่

- เรียงลํ าดับตามคีย

- สามารถอางถึงขอมูลตัวใดก็ไดในเวลาที่เทากัน จึงไมเหมาะกับกรณีที่เก็บขอมูลแบบ linked list

เปรียบเทียบครั้งที่ 1

เปรียบเทียบครั้งที่ 2

(7)

Binary Search : Binary2

int Binary2( ListType *pList, KeyType TargetKey ) {

int top, bot, mid;

bot = 0; top = pList->count - 1;

while ( bot <= top ) { mid = (bot + top) / 2;

if ( EQ( pList->data[mid].key, TargetKey ) ) return( mid );

else

if ( LT( pList->data[mid].key, TargetKey ) ) bot = mid + 1;

else

top = mid - 1;

}

return( -1 );

}

a b c d g h k m p s t u x

0 1 2 3 4 5 6 7 8 9 10 11 12

(8)

Binary Search : Binary1

int Binary1( ListType *pList, KeyType TargetKey ) {

int top, bot, mid;

bot = 0; top = pList->count - 1;

if ( top == -1 ) return( -1 );

while ( bot < top ) { mid = (bot + top) / 2;

if ( LT( pList->data[mid].key, TargetKey ) ) bot = mid + 1;

else

top = mid;

}

if ( EQ( pList->data[top].key, TargetKey ) ) return( top );

else

return( -1 );

}

a b c d g h k m p s t u x

0 1 2 3 4 5 6 7 8 9 10 11 12

(9)

Comparison Trees

Sequential search

2

3 1

n-1

n 1

2

3

n-1

n

=

=

=

=

=

(10)

Comparison Trees

Binary2

3

=

6 9

0 2 5 8

1 7

4

= =

= = = =

= = =

<

<

< < <

< <

<

<

<

(11)

Comparison Trees

5 6

0 1

0 2 3 4 5 7 8 9

1 3 6 8

2 7

4

2 3 4

1 5

0 6

7 8 9

= = =

=

= =

= = =

= =

Binary1

(12)

!

ราก กิ่ง ใบ จุดภายใน ระดับ ความสูง ของตนไม

!

ทางเดินจากจุด a ถึง b ในตนไม คือลํ าดับของกิ่งของตนไมที่ตอกัน เปนทางเดินจากจุด a ถึงจุด b

!

ตนไมที่สมดุล คือตนไมที่ทุกๆใบในตนไมจะอยูในระดับที่ตางกันได อยางมาก เพียง 1 ระดับ

Trees

ราก

ใบ

จุดภายใน

กิ่ง ระดับที่ 0

ระดับที่ 1 ระดับที่ 2 ระดับที่ 3

ความสูง = 3

(13)

Comparison Trees

!

2-tree คือตนไมที่ทุกๆจุดภายใน ของตนไม จะมีจุดที่เปนลูก 2 จุด ดังนั้น 2-tree ที่มีความสูง h จะมีจํ านวนใบอยางมาก 2 ใบ

!

ตนไมเปรียบเทียบคือตนไมแบบ 2-tree

!

ตนไมเปรียบเทียบของการคนแบบทวิภาค จะเปนตนไมสมดุล

!

ตนไมเปรียบเทียบที่มี k ใบ จะมีความสูง h

h

h = ? log k 

2

(14)

!

External path length - ผลรวมของจํ านวนกิ่งของทางเดิน ทั้งหมดจากรากถึงทุกๆใบของตนไม

!

Internal path length - ผลรวมของจํ านวนกิ่งของทางเดิน

ทั้งหมดจากรากถึงทุกๆจุดภายในของตนไม (ซึ่งคือจุดที่ไมใชใบ)

External & Internal Path Lengths

ราก

ใบ

จุดภายใน External path length กิ่ง

E = 2+3+3+2+3+3 = 16 Internal path length

I = 1+2+1+2 = 6

ให q แทนจํ านวนจุดภายในทั้งหมดของตนไม

E = I + 2q

(15)

E - External path length I - Internal path length n - the number of data

Comparison Counts

กรณีที่หาพบ กรณีที่หาไมพบ

Binary1

Binary2

E n

E n 2E n+1 2I

n + 1

(16)

Comparison Counts : Binary1

5 6

1 0

0 2 3 4 5 7 8 9

1 3 6 8

2 7

4

2 3 4

1 5

0 6

7 8 9

== =

=

= =

= = =

= =

!

ตนไมเปรียบเทียบของการคนขอมูลจํ านวน n ตัว มี 2n ใบ

!

จํ านวนครั้งในการเปรียบเทียบที่มากที่สุด จะเทากับความสูงของ ตนไม

เปรียบเทียบ

!

ความสูงของตนไมเปรียบเทียบของ Binary1 จะประมาณ

log 2n = 1 + log n

2 2

(17)

Comparison Counts : Binary2

3

=

6 9

0 2 5 8

1 7

4

= =

= = = =

= = =

<

<

< < <

< <

<

<

<

ในกรณีที่ไมพบคีย :

ในกรณีที่พบคีย : E = I + 2q

I = E - 2q

= (n+1) log (n+1) - 2n

2

2I

n + 1 = log (n+1) - 3 2(n+1)

n

2

2 log (n+1)

2

(18)

Sequential vs. Binary Search

n คือจํ านวนขอมูล

กรณีที่หาพบ กรณีที่หาไมพบ

Sequential 0.5(n+1) n Binary1

Binary2

จํ านวนการเปรียบเทียบเฉลี่ย

log n + 1

2

log n + 1

2

2log n - 3

2

2log n

2

Algorithms

(19)

Sequential vs. Binary Search

time

# of data

Sequential

Binary2 Binary1

(20)

Sequential Search

=

1

<

1

=

2

<

2

=

n

<

n

...

int SeqSearch( ListType pList,

KeyType TargetKey ) {

int loc;

for ( loc=0; loc<pList->count; loc++ ) {

if ( GT( TargetKey, pList->data[loc].key ) ) continue;

if ( EQ( TargetKey, pList->data[loc].key ) ) return( loc );

else

return( -1 );

}

return( -1 );

}

กรณีหาคียพบ :

(2+3+...+n+(n+1))/ n = 0.5(n+3)

กรณีหาคียไมพบ :

(2+3+...+n+(n+1) + n)/(n+1) = 0.5(n+3) + n/(n+1)
(21)

Lower Bounds for Searching

5 6

1 0

0 2 3 4 5 7 8 9

1 3 6 8

2 7

4

2 3 4

1 5

0 6

7 8 9

== =

=

= =

= = =

= =

การคนขอมูล n ตัว จะไดผล 2n+1 กรณี ซึ่งคือ

- กรณีพบคีย จะมี n กรณี (เนื่องจากมีขอมูลอยู n ตัว) - กรณีไมพบคีย จะมี n+1 กรณี ซึ่งคือกรณีที่ คียที่หา - มีคานอยกวาตัวแรก, มีคาระหวางตัวแรกกับตัวที่สอง, มีคาระหวางตัวที่สองกับตัวที่สาม ,...

มีคามากกวาตัวที่ n

ใบของตนไมเปรียบเทียบแทนผลของการคน และความสูงของตนไมเปรียบเทียบแทน จํ านวนครั

(22)

Lower Bounds for Searching

Referensi

Dokumen terkait

Algoritrha POP Data, jika diberikan struKur dalam bahasa sebagai berikut : Struct tumpukan. Char nama brg[3?J;

Tk_Uid Tk_GetOption(Tk_Window tkwin, char *name, char *className) int Tk_GetPixels(Tcl_Interp *interp, Tk_Window tkwin, char *string, int *intPtr) Pixmap Tk_GetPixmap(Display

NoFakturPembelian char(11), Tgl Date, TglJatuhTempo Date, IdPurchaseOrder char(11), KdKaryawan char(12), KdSupplier char(4),. StatusPembayaran int default 0,

Nama Field Tipe Data Panjang Keterangan Proses Detail Proses PegawaiID Int 4 Surrogate key Create Autonumber NoPeg Char 6 Kode pegawai Transform Copy NoUnit Char 4 Kode

Sequential Search adalah teknik pencarian data dimana data dicari secara urut dari depan kebelakang atau dari awal sampai akhir, dalam artian pencarian dimulai dari record

Existing sub category information is shown in Table 3.6.5 Field Name Data Type Primary Key Default Value Description Id Int Primary key Category id Int Name Varchar

 Binary search is fast but if we want to insert or delete a key, we have to move n/2 records on average to keep the sorted structure, thus it’s not appropriate for applications, which

3.3.7 Employee Leaves Data Dictionary Field Name Data type Size Constrain Description Employeeleave s_id INT 5 PRIMARY KEY ID of employee leaves Leaveday_type CHAR 12 NOT NULL