อัลกอริธึมที่สูงกว่า


35

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

บางอันก็เป็นลำดับที่สอง แต่ค่อนข้างน่าสนใจกว่า:

  • Fingertrees แปรผันตาม monoids
  • การแยกนิ้วบนเพรดิเคตแบบจำเจ
  • คำนำหน้ารวมอัลกอริธึมอีกครั้งโดยพารามิเตอร์หรือ monoid ฯลฯ

ในที่สุดบางคำสั่งที่สูงกว่า "แท้จริง" ในแง่ที่น่าสนใจที่สุดสำหรับฉัน:

  • Y combinator
  • รายการความแตกต่าง

มีอัลกอริทึมการสั่งซื้อที่สูงกว่าอื่น ๆ หรือไม่?

ในความพยายามที่จะชี้แจงคำถามของฉันภายใต้ "nontrivial-ลำดับสูงกว่า" ฉันหมายถึง "การใช้สิ่งอำนวยความสะดวกขั้นสูงของระเบียบการคำนวณในวิธีที่สำคัญในส่วนต่อประสานของอัลกอริทึมและ / หรือการใช้งาน"


3
ฉันถามอะไรที่คล้ายกันซักครั้ง ตอบไม่กี่คำตอบที่นี่: caml.inria.fr/pub/ml-archives/caml-list/2004/09/…
Radu GRIGore

พวกคุณกำลังพูดถึงอัลกอริทึมที่ใช้อัลกอริทึมและ / หรือส่งคืนอัลกอริทึมหรือไม่?
Pratik Deoghare

คำตอบ:


13

มีฟังก์ชั่นการสั่งซื้อที่สูงขึ้นมากมายในhttp://math.andrej.com/ตัวอย่างเช่นในโพสต์เกี่ยวกับเอ็กซ์โพเนนเชียลสองครั้งประเภท Haskell ต่อไปนี้จะปรากฏขึ้น (เมื่อขยายคำพ้องประเภท):

shift :: Bool -> ((Int -> Bool) -> Bool) -> ((Int -> Bool) -> Bool)

นอกจากนี้คุณยังสามารถสนุกไปกับโพสต์A Haskell Monad สำหรับการค้นหาที่ไม่มีที่สิ้นสุดในเวลา จำกัด - ตัวอย่างเช่น:

newtype S a = S ((a -> Bool) -> a)
bigUnion :: S (S a) -> S a

ฉันเดาประเภทของ bigUnion คือลำดับที่ 4 หรือ 5!


22

มีอัลกอริทึมมากมายที่เป็น "ลำดับที่ 2 จริง ๆ " แม้ว่าโดยทั่วไปจะไม่ได้อธิบายอย่างชัดเจนในข้อกำหนดเหล่านี้ เมื่อใดก็ตามที่เรามีอัลกอริธึมย่อยเชิงเส้นย่อยโดยนัยก็คือการเข้าถึงออราเคิลแบบหนึ่งสำหรับอินพุตเช่นการปฏิบัติอินพุตให้เป็นฟังก์ชันอย่างแท้จริง

ตัวอย่าง:

(1) อัลกอรึทึม Ellipsoid เมื่อทำงานกับ "oracle แยก" (เช่นhttp://math.mit.edu/~vempala/18.433/L18.pdf )

(2) การลดฟังก์ชั่น Submodular (เช่นhttp://people.commerce.ubc.ca/faculty/mccormick/sfmchap8a.pdf )

(3) การทดสอบอสังหาริมทรัพย์ทั้งหมดเป็นแบบฟอร์มนี้ ( http://www.wisdom.weizmann.ac.il/~oded/test.html )

(4) การประมูลแบบ Combinatorial ในรูปแบบแบบสอบถาม (เช่น http://pluto.huji.ac.il/~blumrosen/papers/iter.pdf )


15

มีคำตอบสำหรับคำถามนี้อีก: ไม่มี โดยเฉพาะอย่างยิ่งใด ๆ เช่น (implementable!) อัลกอริทึมที่สูงขึ้นเพื่อเป็นกลไกเทียบเท่ากับขั้นตอนวิธีการสั่งซื้อครั้งแรกโดยใช้defunctionalization

ให้ฉันมีความแม่นยำมากขึ้น: ในขณะที่มีอัลกอริทึมที่สูงกว่าจริง ๆ ในทางปฏิบัติมันเป็นไปได้เสมอที่จะเขียนซ้ำแต่ละอินสแตนซ์เป็นโปรแกรมสั่งซื้อครั้งแรกอย่างแท้จริง กล่าวอีกนัยหนึ่งไม่มีโปรแกรมลำดับสูงกว่าอิ่มตัว - เป็นหลักเพราะอินพุต / เอาต์พุตของโปรแกรมเป็นบิตสตริง [ใช่สตริงบิตเหล่านั้นสามารถใช้แทนฟังก์ชั่นได้ แต่นั่นคือประเด็น: มันเป็นตัวแทนของฟังก์ชั่น แต่ไม่ใช่ฟังก์ชั่น]

คำตอบที่ได้รับนั้นยอดเยี่ยมมากและคำตอบของฉันไม่ควรถือเป็นข้อขัดแย้ง ควรพิจารณาว่าเป็นการตอบคำถามจากบริบทที่มีขนาดใหญ่กว่าเล็กน้อย (โปรแกรมที่สมบูรณ์แทนที่จะเป็นอัลกอริธึมแบบสแตนด์อะโลน) และการเปลี่ยนแปลงบริบทนี้เปลี่ยนคำตอบอย่างสิ้นเชิง ประเด็นของคำตอบของฉันคือเตือนผู้คนถึงสิ่งนี้ซึ่งง่ายเกินไปที่จะลืม


ฉันยอมรับว่าอัลกอริธึมที่สูงกว่าใด ๆ นั้นเทียบเท่ากับอัลกอริทึมลำดับที่หนึ่งที่มีสเปคภายนอกเดียวกัน แต่สิ่งนี้ไม่ควรกีดกันเราจากการโต้แย้งเกี่ยวกับคุณสมบัติภายในของพวกเขา ไม่มีความแตกต่างระหว่างการแสดงบางสิ่งบางอย่างและการเป็นอะไร
jkff

1
@jkff: ฉันเห็นด้วยกับจุดแรกของคุณ - เราควรหารือเกี่ยวกับคุณสมบัติภายในเหล่านี้อย่างแน่นอน ฉันไม่เห็นด้วยอย่างชัดเจนกับประเด็นที่สอง: คุณกำลังอ้างว่าส่วนขยายและความตั้งใจนั้น 'เหมือนกัน' ซึ่งเป็นเท็จอย่างชัดเจน [เตือนฉันถึงภาพวาด Matisse 'นี่ไม่ใช่ท่อ']
Jacques Carette

อ่าใช่ "ความเลวทรามแห่งการเปลี่ยนแปลงของกทพ." (\\() -> "Ceci n'est pas une fonction") ()
CA McCann

ฉันอ้างว่าหากมีสองสิ่งที่เทียบเท่ากัน (โดยการเป็นตัวแทนของกันและกัน) คุณไม่สามารถปฏิเสธการมีอยู่ของสิ่งใดสิ่งหนึ่งได้ :)
jkff

@jkff: ยากที่จะไม่เห็นด้วยกับสิ่งนั้น!
Jacques Carette

13

ในไลบรารีตัวแยกวิเคราะห์ parser ลำดับของฟังก์ชันโดยทั่วไปค่อนข้างสูง ลองใช้ฟังก์ชั่นการเรียงลำดับขั้นสูงกว่าหรือทำไมใครก็ตามที่ต้องการใช้ฟังก์ชั่นลำดับที่หก? โดย Chris Okasaki วารสารการเขียนโปรแกรมเชิงฟังก์ชั่น , 8 (2): 195-199, มีนาคม 1998


นี่เป็นกระดาษที่ยอดเยี่ยม แต่ไม่ใช่สิ่งที่ฉันกำลังมองหา แม้ว่าคอมบิเนเตอร์จะมีลำดับสูงกว่าพวกมันเรียบง่ายและเป็นอิสระมากและซิงเกิ้ลใด ๆ ของพวกเขาแทบจะนับได้ว่าเป็นอัลกอริธึม / โครงสร้างข้อมูลที่ไม่ใช่เรื่องไร้สาระ ในทางตรงกันข้าม Y combinator เป็นอัลกอริธึมที่ไม่สำคัญอย่างยิ่งในการค้นหาจุดคงที่และรายการความแตกต่างเป็นโครงสร้างข้อมูลที่ฉลาดที่สร้างขึ้นจากฟังก์ชั่นลำดับสูง (ฉันไม่บั่นทอนคำตอบของคุณเพียงแค่พยายามที่จะชี้แจงคำถามของฉัน)
jkff

13

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

Klaus Weihrach ได้พูดถึงสิ่งนี้ว่าเป็นลำดับชั้นที่สองของประสิทธิผลของโครงสร้างที่คำนวณได้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ดูที่ Weihrach & Grubba 2009 ประถมคำนวณโทโพโลยีและในหน้าการวิจัยจอห์นทักเกอร์, การคำนวณด้วย Topological ข้อมูล ฉันพูดถึงหน้าทักเกอร์ในคำถามของฉัน, การประยุกต์ใช้ต้นเสียงอวกาศ


และสิ่งนี้ขยายไปถึงวัตถุทางคณิตศาสตร์ที่คำนวณได้โดยทั่วไป: ตัวเลขที่คำนวณได้อื่น ๆ (ไม่จำเป็นต้องเป็นจริง), องค์ประกอบที่คำนวณได้ของกลุ่มที่ไม่มีที่สิ้นสุด (วงแหวน, algebras, ... ), จุดที่คำนวณได้ในช่องว่าง ฯลฯ ในทุกกรณี ทฤษฎีที่เกี่ยวข้องกับการดึงข้อมูลจากฟังก์ชั่นการแสดง (ของวิธีการคำนวณวัตถุทางคณิตศาสตร์) และไม่ได้มาจากวัตถุเอง
ex0du5

13

โมดูลัสของความต่อเนื่องการทำงานเป็นแผนที่mที่ยอมรับ (ต่อเนื่อง) การทำงานF : (nat -> nat) -> natและผลตัวเลขkดังกล่าวว่าF f = F gเมื่อใดก็ตามที่ทั้งหมดf i = g i i < kมีอัลกอริธึมสำหรับการคำนวณโมดูลัสความต่อเนื่อง (ไม่มีประสิทธิภาพมาก) ดังนั้นมันจึงเป็นตัวอย่างของอัลกอริธึมลำดับที่ 3


9

เพื่อเติมเต็มคำตอบของ Noamนอกจากนี้ยังมีหลายสถานการณ์ที่จำเป็นต้องมีเอาต์พุต (ฟังก์ชั่นการแสดงออกอย่างชัดเจน)

C:0,1n0,1mA (α,L,ϵ)CnAM1,,ML

w0,1m,PrA[m, (Ag(C(m),w)α i[L], j[n], PrMi[Mi(j)=mj]1ϵ)]2/3

AgA2/3ϵmmα


5

ในอัลกอริธึมกราฟจุดยอดและขอบมักจะถูกมองว่าเป็นข้อมูลธรรมดา แต่จริง ๆ แล้วสามารถนำไปใช้เป็นมาตรฐานในการผลิตเพื่อให้เกิดการเขียนโปรแกรมตามความต้องการ

ระหว่างปริญญาเอกของฉัน (ในเคมีเชิงคำนวณ) ฉันใช้อัลกอริธึมกราฟจำนวนมากในรูปแบบลำดับสูงกว่าเพื่อนำไปใช้กับการวิเคราะห์กราฟโดยปริยายส่วนใหญ่เป็นเพราะกราฟที่แท้จริงของฉันไม่มีที่สิ้นสุดดังนั้นฉันจึงไม่สามารถจัดเก็บได้อย่างชัดเจน! โดยเฉพาะฉันกำลังศึกษาโทโพโลยีของวัสดุอสัณฐานที่แสดงเป็น 3D tilings ของเซลล์หน่วย (supercells)

ตัวอย่างเช่นคุณสามารถเขียนฟังก์ชันเพื่อคำนวณเชลล์เพื่อนบ้านที่ใกล้ที่สุดลำดับที่ต้นกำเนิดต้นกำเนิดiแบบนี้:

nth i 0 = {i}
nth i 1 = neighbors i
nth i n = diff (diff (fold union empty (map neighbors (nth i (n-1)))) (nth i (n-1))) (nth i (n-2))

โดยที่neighborsฟังก์ชันจะคืนค่าชุดของจุดยอดใกล้เคียงไปยังจุดยอดที่กำหนด

ตัวอย่างเช่นโครงตาข่ายเหลี่ยม 2D:

neighbors (x, y) = {(x-1, y), (x+1, y), (x, y-1), (x, y+1)}

อัลกอริทึมที่น่าสนใจอื่น ๆ ในบริบทนี้รวมถึงสถิติเส้นทางที่สั้นที่สุดของ Franzblau


นี่ทำให้ฉันมีคำถามที่ครั้งหนึ่ง หากมีวิธีการทางโปรแกรมในการกำหนดกราฟด้วยวิธีนี้มีวิธีในการกำหนดกราฟขัดแย้งอ้างอิงตนเอง?
Suresh Venkat

1
{x:xx}{x:xx}

แน่ใจ แต่นั่นคือกราฟอ้างอิงตนเอง?
Suresh Venkat

@Suresh: มันเป็นกราฟที่กำหนดไว้ในภาษาที่ใช้งานได้ในแง่ที่ว่ามีUจุดยอดและฟังก์ชันU -> U -> Boolของขอบ
sdcvvc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.