ต้นไม้เหล่านี้มีรูปร่างผิดปกติหรือไม่?


21

บทนำ

ในการท้าทายนี้งานของคุณคือการเขียนโปรแกรมที่ตัดสินว่าต้นไม้ที่ให้มาสองต้นนั้นเป็น isomorphic หรือไม่ ทรีหมายถึงกราฟที่กำหนดทิศทางโดยที่ทุกโหนดมีขอบขาออกเดียวยกเว้นรูทซึ่งไม่มี ต้นไม้สองต้น isomorphic หากสามารถแปลงเป็นต้นไม้อื่นได้โดยเปลี่ยนชื่อโหนด ตัวอย่างเช่นต้นไม้สองต้น (ที่ขอบทุกจุดชี้ขึ้น)

  0       0
 /|\     /|\
1 3 4   1 2 5
|\       /|
2 5     3 4

จะเห็นได้อย่างง่ายดายว่าเป็น isomorphic

เราเข้ารหัสต้นไม้เป็นรายการLของจำนวนเต็ม nonnegative ในวิธีต่อไปนี้ รากของต้นไม้ที่มีฉลากและก็ยังมีโหนด0 1,2,...,length(L)แต่ละโหนดi > 0มีขอบออกไปถึงL[i](โดยใช้การจัดทำดัชนีแบบ 1 ฐาน) ตัวอย่างเช่นรายการ (พร้อมดัชนีที่ให้ไว้ภายใต้องค์ประกอบ)

[0,0,1,3,2,2,5,0]
 1 2 3 4 5 6 7 8

เข้ารหัสต้นไม้

  0
 /|\
1 2 8
| |\
3 5 6
| |
4 7

อินพุต

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

  1. พวกเขาไม่ว่างเปล่า
  2. พวกเขามีความยาวเท่ากัน
  3. แต่ละรายการLน่าพอใจL[i] < iสำหรับทุก (1-based) iดัชนี

เอาท์พุต

ผลลัพธ์ของคุณจะเป็นค่าความจริงหากต้นไม้มีค่า isomorphic และมีค่าไม่แน่นอนถ้าไม่

กฎและการให้คะแนน

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

กรณีทดสอบ

อินสแตนซ์ที่แท้จริง

[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]

อินสแตนซ์ที่เป็นเท็จ

[0,0] [0,1]
[0,1,2,0,3,3,4] [0,1,2,3,0,4,3]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,5,2,1]
[0,1,1,0,1,3,2,1,5] [0,1,0,3,3,3,2,5,2]
[0,1,2,3,1,2,3,0,8] [0,1,0,1,4,4,5,6,6]
[0,1,0,2,0,3,0,4,0,5] [0,0,2,1,0,3,4,0,0,9]


@DigitalTrauma Dangit คุณสร้างตัวไม่อนุญาตแก่ OP ... ฉันมีวิธีแก้ปัญหา Mma 60 ไบต์ ...
LegionMammal978

คำตอบ:


2

Mathematica, 48 ไบต์

SameQ@@(Sort//@(0(0//.PositionIndex@#))&/@{##})&

มันสั้นกว่าโซลูชันที่ใช้IsomorphicGraphQ:

IsomorphicGraphQ@@(Graph@*MapIndexed[#->Tr@#2&]/@{##})&

6

Python 83

ฟังก์ชั่นที่ไม่ระบุชื่อในบรรทัดที่ 2 คือโซลูชันของฉัน

f=lambda l,i=0:sorted(f(l,j+1)for j,e in enumerate(l)if e==i)
lambda a,b:f(a)==f(b)

fส่งคืนรูปแบบทรีของทรีย่อยซึ่งเป็นรายการที่เรียงลำดับของลูกที่ด จากนั้นเราจะต้องตรวจสอบว่ารูปแบบที่ถูกทำให้เป็นนักบุญของต้นไม้แต่ละต้นเท่ากันหรือไม่

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