กลับไปหน้าบทความ

อ่าน 4 นาที

การเปรียบเทียบสามทาง

ใน วิทยาการคอมพิวเตอร์ การเปรียบเทียบ แบบ สามทาง จะใช้ค่าสองค่า A และ B ที่อยู่ในประเภทเดียวกันที่มี ลำดับสมบูรณ์ และตรวจสอบว่า A < B, A = B หรือ A > B...

การเปรียบเทียบสามทาง

ในวิทยาการคอมพิวเตอร์ การเปรียบเทียบ แบบสามทางจะใช้ค่าสองค่า A และ B ที่อยู่ในประเภทเดียวกันที่มีลำดับสมบูรณ์และตรวจสอบว่า A < B, A = B หรือ A > B ในการดำเนินการเพียงครั้งเดียว ตามกฎทางคณิตศาสตร์ของไตรภาค

สามารถนำไปใช้ได้ในรูปแบบของฟังก์ชัน (เช่นstrcmpในภาษา C ) เมธอด (เช่นcompareToในภาษา Java ) หรือตัวดำเนินการ (เช่นตัวดำเนินการยานอวกาศ<=>ในPerl , PHPและC++ )

การคำนวณระดับเครื่องจักร

โปรเซสเซอร์ส่วนใหญ่มีชุดคำสั่งที่รองรับการดำเนินการดังกล่าวกับประเภทข้อมูลพื้นฐาน ในบางเครื่อง คำสั่งเปรียบเทียบจะตั้งค่าแฟล็ก[ a ]ที่สามารถทดสอบได้โดยคำสั่งแยกสาขาแบบมีเงื่อนไขในภายหลัง[ b ]

ในเครื่องที่เน้นคำบางเครื่อง คำสั่งเปรียบเทียบจะข้ามไปโดยจะดำเนินการต่อที่ PC, PC+1 หรือ PC+2 ขึ้นอยู่กับผลลัพธ์ของการเปรียบเทียบ[ c ]เครื่องเหล่านี้ส่วนใหญ่ยังมีคำสั่งแยกสาขาแบบมีเงื่อนไขด้วย

เครื่องคอมพิวเตอร์บางเครื่องมีจำนวนเต็มแบบ มีเครื่องหมายโดยอิงจาก การแสดงค่าแบบเครื่องหมายและขนาดหรือแบบส่วนเติมเต็มหนึ่ง (ดู การแสดงจำนวนแบบมีเครื่องหมาย ) ซึ่งทั้งสองแบบนี้อนุญาตให้มีค่าศูนย์บวกและลบ ที่แตกต่างกัน ได้ สิ่งนี้ไม่ขัดกับหลักไตรภาคตราบใดที่ใช้ลำดับรวมที่สอดคล้องกัน กล่าวคือ −0 = +0 หรือ −0 < +0 ถือว่าถูกต้อง อย่างไรก็ตาม ประเภท จุดลอยตัว ทั่วไป มีข้อยกเว้นสำหรับหลักไตรภาค คือ มีค่าพิเศษ "NaN" ( ไม่ใช่จำนวน ) ซึ่งทำให้x < NaN, x > NaN และx = NaN เป็นเท็จสำหรับค่าจุดลอยตัวx ทั้งหมด (รวมถึง NaN เองด้วย)

ภาษาระดับสูง

ความสามารถ

ในภาษาซีฟังก์ชัน `from` strcmpและmemcmp`from` ทำการเปรียบเทียบแบบสามทางระหว่างสตริงและบัฟเฟอร์หน่วยความจำตามลำดับ โดยจะคืนค่าเป็นจำนวนลบเมื่ออาร์กิวเมนต์ตัวแรกมีค่าน้อยกว่าอาร์กิวเมนต์ตัวที่สองในเชิงพจนานุกรม คืนค่าเป็นศูนย์เมื่ออาร์กิวเมนต์ทั้งสองเท่ากัน และคืนค่าเป็นจำนวนบวกในกรณีอื่นๆ ธรรมเนียมการคืนค่า "เครื่องหมายของความแตกต่าง" นี้ถูกขยายไปยังฟังก์ชันเปรียบเทียบใดๆ โดยฟังก์ชันเรียงลำดับมาตรฐาน `from` qsortซึ่งรับฟังก์ชันเปรียบเทียบเป็นอาร์กิวเมนต์และกำหนดให้ฟังก์ชันนั้นต้องปฏิบัติตามธรรมเนียมดังกล่าว

ในPerl (สำหรับการเปรียบเทียบตัวเลขเท่านั้นcmpตัวดำเนินการจะใช้สำหรับการเปรียบเทียบคำศัพท์ของสตริง) PHP (ตั้งแต่เวอร์ชัน 7) Rubyและ Apache Groovyตัวดำเนินการ "spaceship operator" <=>จะส่งคืนค่า −1, 0 หรือ 1 ขึ้นอยู่กับว่า A < B, A = B หรือ A > B ตามลำดับ ฟังก์ชันใน Python 2.x cmp(ถูกลบออกใน 3.x) OCamlcompareและKotlincompareToคำนวณสิ่งเดียวกัน ในไลบรารีมาตรฐานของHaskellฟังก์ชันการเปรียบเทียบสามทางถูกกำหนดไว้สำหรับทุกประเภทในคลาสโดยจะส่งคืนประเภทซึ่งมีค่าเป็น(น้อยกว่า) (เท่ากับ) และ(มากกว่า): [ 3 ]compareOrdOrderingLTEQGT

ลำดับข้อมูล= LT | EQ | GT

ภาษา โปรแกรมเชิงวัตถุหลายภาษา มี ฟังก์ชันเปรียบเทียบสามทางซึ่งทำการเปรียบเทียบสามทางระหว่างวัตถุหนึ่งกับวัตถุอื่นที่กำหนดให้ ตัวอย่างเช่น ในJavaคลาสใดๆ ที่ใช้งานComparableอินเทอร์เฟซจะมีcompareToเมธอดที่ส่งคืนค่าจำนวนเต็มลบ ศูนย์ หรือจำนวนเต็มบวก หรือโยนข้อยกเว้นNullPointerException(ถ้าวัตถุหนึ่งหรือทั้งสองเป็นเท็จnull) ในทำนองเดียวกัน ในเฟรมเวิร์ก . NETคลาสใดๆ ที่ใช้งานIComparableอินเทอร์เฟซจะมีCompareToเมธอดดังกล่าว ในC++คลาสใดๆ ที่สามารถเปรียบเทียบสามทางได้สามารถเป็นพารามิเตอร์ให้กับอินสแตนซ์ของstd::compare_three_way , std::strong_order, std::weak_order, หรือstd::partial_orderได้

ตั้งแต่ Java เวอร์ชัน 1.5 เป็นต้นมา สามารถคำนวณค่าเดียวกันได้โดยใช้Math.signumวิธีการแบบ static หากทราบค่าความแตกต่างโดยไม่มีปัญหาการคำนวณ เช่นการโอเวอร์โฟลว์ทางคณิตศาสตร์ที่กล่าวถึงด้านล่าง ภาษาคอมพิวเตอร์หลายภาษาอนุญาตให้กำหนดฟังก์ชันได้ ดังนั้นcompare(A,B)จึงสามารถสร้างขึ้นได้อย่างเหมาะสม แต่คำถามคือว่าการนิยามภายในของฟังก์ชันนั้นสามารถใช้ไวยากรณ์แบบสามทางได้หรือไม่ หรือต้องอาศัยการทดสอบซ้ำๆ

เมื่อทำการเปรียบเทียบแบบสามทางในกรณีที่ไม่มีตัวดำเนินการหรือวิธีการเปรียบเทียบแบบสามทางอยู่แล้ว มักจะรวมการเปรียบเทียบสองแบบเข้าด้วยกัน เช่น A = B และ A < B หรือ A < B และ A > B ในทางทฤษฎี คอมไพเลอร์อาจสรุปได้ว่านิพจน์ทั้งสองนี้สามารถแทนที่ด้วยการเปรียบเทียบเพียงครั้งเดียวตามด้วยการทดสอบผลลัพธ์หลายครั้งได้ แต่ไม่มีการกล่าวถึงการปรับปรุงประสิทธิภาพในลักษณะนี้ในตำราที่เกี่ยวข้องกับเรื่องนี้

ในบางกรณี การเปรียบเทียบแบบสามทางสามารถจำลองได้โดยการลบ A และ B แล้วตรวจสอบเครื่องหมายของผลลัพธ์ โดยใช้คำสั่งพิเศษสำหรับการตรวจสอบเครื่องหมายของตัวเลข อย่างไรก็ตาม วิธีนี้จำเป็นต้องให้ชนิดของ A และ B มีผลต่างที่กำหนดไว้อย่างชัดเจน จำนวนเต็มที่มีเครื่องหมายแบบความกว้างคงที่อาจเกิดการโอเวอร์โฟลว์เมื่อถูกลบ ตัวเลขทศนิยมจะมีค่าเป็นNaNโดยไม่มีเครื่องหมายที่กำหนด และสตริงอักขระไม่มีฟังก์ชันผลต่างที่สอดคล้องกับลำดับทั้งหมด ในระดับเครื่องจักร การโอเวอร์โฟลว์มักจะถูกติดตามและสามารถใช้เพื่อกำหนดลำดับหลังจากการลบได้ แต่ข้อมูลนี้มักจะไม่สามารถใช้งานได้ในภาษาโปรแกรมระดับสูงกว่า

ในกรณีหนึ่งของ เงื่อนไขสามทางที่ภาษาโปรแกรม Fortran มีให้ คำสั่ง IFสามทางทางคณิตศาสตร์ของFortran ซึ่งปัจจุบันเลิกใช้แล้ว จะพิจารณาเครื่องหมายของนิพจน์ทางคณิตศาสตร์และเสนอป้ายกำกับสามป้ายให้กระโดดไปตามเครื่องหมายของผลลัพธ์:

ถ้า( นิพจน์) ลบศูนย์บวก

ฟังก์ชัน strcmp ซึ่งเป็นฟังก์ชันทั่วไปในไลบรารีของ ภาษา Cและภาษาที่เกี่ยวข้อง เป็นฟังก์ชันเปรียบเทียบสตริงแบบเรียงตามลำดับตัวอักษรสามทาง อย่างไรก็ตาม ภาษาเหล่านี้ขาดฟังก์ชันเปรียบเทียบแบบสามทางทั่วไปสำหรับข้อมูลประเภทอื่น ๆ

ผู้ควบคุมยานอวกาศ

ตัวดำเนินการเปรียบเทียบสามทางหรือ "ตัวดำเนินการยานอวกาศ" สำหรับตัวเลขจะถูกแสดงเป็น<=>ในPerl , Ruby , Apache Groovy , PHP , Eclipse CeylonและC ++ [ 4 ]

ในC++ การแก้ไข C ++20เพิ่มตัวดำเนินการ spaceship <=>ซึ่งส่งคืนค่าที่เข้ารหัสว่าค่าทั้งสองเท่ากัน น้อยกว่า มากกว่า หรือไม่เรียงลำดับ และสามารถส่งคืนประเภทที่แตกต่างกันได้ขึ้นอยู่กับความเข้มงวดของการเปรียบเทียบ[ 5 ]

ที่มาของชื่อนี้เกิดจากการที่Randal L. Schwartz นึกถึง ยานอวกาศในเกมStar Trekที่เขียนด้วย HP BASIC [ 6 ]นักเขียนโค้ดอีกคนหนึ่งแนะนำว่ามันถูกตั้งชื่อเช่นนั้นเพราะมันดูคล้ายกับยาน TIE fighter ของดาร์ธ เวเดอร์ ในภาพยนตร์Star Wars [ 7 ]

ตัวอย่างในภาษา PHP:

เสียงสะท้อน1 <=> 1 ; // 0 เอคโค่1 <=> 2 ; // -1 เอคโค2 <=> 1 ; // 1

ตัวอย่างในภาษา C++:

1 <=> 1 ; // ประเมินค่าเป็น std::strong_ordering::equal 1 <=> 2 ; // ประเมินค่าเป็น std::strong_ordering::less 2 <=> 1 ; // ประเมินค่าเป็น std::strong_ordering::greater

ประเภทข้อมูลแบบผสม

การเปรียบเทียบแบบสามทางมีคุณสมบัติที่ง่ายต่อการสร้างและ เปรียบเทียบ ตามลำดับตัวอักษรของประเภทข้อมูลที่ไม่ใช่ประเภทพื้นฐาน ซึ่งแตกต่างจากการเปรียบเทียบแบบสองทาง

ต่อไปนี้เป็นตัวอย่างการเขียนโค้ดในภาษา Perl

sub compare ($$) { my ( $a , $b ) = @_ ; return $a -> { unit } cmp $b -> { unit } || $a -> { rank } <=> $b -> { rank } || $a -> { name } cmp $b -> { name }; }

โปรดทราบว่าcmp`true` ใน Perl ใช้สำหรับสตริง ในขณะที่ `false` <=>ใช้สำหรับตัวเลข การเปรียบเทียบแบบสองทางมักจะไม่กระชับเท่า แต่ไม่ได้หมายความว่าจะอ่านยากกว่าเสมอไป ตัวอย่างข้างต้นใช้ประโยชน์จากการประเมินแบบลัดวงจรของ||ตัวดำเนินการ และข้อเท็จจริงที่ว่า 0 ถือว่าเป็นเท็จใน Perl ดังนั้น หากการเปรียบเทียบครั้งแรกเท่ากัน (ดังนั้น `false` จึงประเมินค่าเป็น 0) มันจะ "ข้ามไป" ที่การเปรียบเทียบครั้งที่สอง และต่อไปเรื่อยๆ จนกว่าจะพบค่าที่ไม่ใช่ศูนย์ หรือจนกว่าจะถึงจุดสิ้นสุด

ในบางภาษา เช่นPython , Ruby , Haskellเป็นต้น การเปรียบเทียบลิสต์จะทำตามลำดับตัวอักษร ซึ่งหมายความว่าเราสามารถสร้างลำดับการเปรียบเทียบได้เหมือนตัวอย่างข้างต้น โดยการใส่ค่าลงในลิสต์ตามลำดับที่ต้องการ ตัวอย่างเช่น ใน Ruby:

[ a . หน่วย, a . ยศ, a . ชื่อ] <=> [ b . หน่วย, b . ยศ, b . ชื่อ]

ในภาษา C++:

std :: tie ( a.unit , a.rank , a.name ) <=> std :: tie ( b.unit , b.rank , b.name )

ตัวดำเนินการเชื่อมต่อ SQL

ในภาษา SQL บางภาษา จะ<=>ใช้เป็น ตัวดำเนินการเชื่อมต่อ ที่ปลอดภัยจากค่าว่างซึ่งจะจับคู่ตัวถูกดำเนินการหากทั้งสองเป็นค่าว่าง[ 8 ]

ดูเพิ่มเติม

หมายเหตุ

  1. ^เครื่องจักรแต่ละชนิดมีชื่อเรียกที่แตกต่างกันไป คำศัพท์ที่ใช้กันทั่วไป ได้แก่รหัสสภาพ ,ธง ,ตัวบ่งชี้และสถานะ
  2. ^เช่น เปรียบเทียบกับ A (CMPA), เปรียบเทียบกับ Q (CMPQ), เปรียบเทียบกับ AQ (CMPAQ), เปรียบเทียบกับ X n (CMPXn), เปรียบเทียบกับขีดจำกัด (CWL), เปรียบเทียบขนาด (CMG) บน GE 635 [ 1 ]
  3. ^เช่น เปรียบเทียบค่าสะสมกับพื้นที่จัดเก็บ (CAS) และเปรียบเทียบค่าสะสมเชิงตรรกะกับพื้นที่จัดเก็บ (LAS) บนIBM 7094 [ 2 ]
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Three-way_comparison&oldid=1352251836 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การเปรียบเทียบสามทาง

ใน วิทยาการคอมพิวเตอร์ การเปรียบเทียบ แบบ สามทาง จะใช้ค่าสองค่า A และ B ที่อยู่ในประเภทเดียวกันที่มี ลำดับสมบูรณ์ และตรวจสอบว่า A B...

การคำนวณระดับเครื่องจักร

โปรเซสเซอร์ส่วนใหญ่มี ชุดคำสั่ง ที่รองรับการดำเนินการดังกล่าวกับประเภทข้อมูลพื้นฐาน ในบางเครื่อง คำสั่งเปรียบเทียบจะตั้งค่าแฟล็ก [ a ] ที่สามารถทดสอบได้โดยคำสั่งแยกสาขาแบบมีเงื่อนไขในภายหลัง [ b ]

ความสามารถ

ใน ภาษาซี ฟังก์ชัน `from` strcmp และ memcmp `from` ทำการเปรียบเทียบแบบสามทางระหว่างสตริงและบัฟเฟอร์หน่วยความจำตามลำดับ โดยจะคืนค่าเป็นจำนวนลบเมื่ออาร์กิวเมนต์ตัวแรกมีค่า น้อย กว่าอาร์กิวเมนต์ตัวที่สองในเชิงพจนานุกรม...

ผู้ควบคุมยานอวกาศ

ตัวดำเนินการเปรียบเทียบสามทางหรือ "ตัวดำเนินการยานอวกาศ" สำหรับตัวเลขจะถูกแสดงเป็น ใน Perl , Ruby , Apache Groovy , PHP , Eclipse Ceylon และ C ++ [ 4 ]