นี่ฉันมีจำนวนเต็ม1:7
สำหรับสี่พาร์ทิชันที่แตกต่างกันกล่าวคือ {1}, {2,3,4}, {5,6} และ {7} list(1,c(2,3,4),c(5,6),7)
และพาร์ทิชันเหล่านั้นจะถูกเขียนในรายการคือ ฉันถือว่าพาร์ติชั่นเป็นชุด, ดังนั้นการเปลี่ยนแปลงองค์ประกอบที่แตกต่างกันภายในพาร์ติชั่นหนึ่งควรถูกจดจำเป็นพาร์ติชั่นเดียวกัน. ตัวอย่างเช่นlist(1,c(2,3,4),c(5,6),7)
และlist(7,1,c(2,3,4),c(6,5))
เทียบเท่า
โปรดทราบว่าไม่มีการทำซ้ำสำหรับองค์ประกอบในรายการเช่นไม่ใช่list(c(1,2),c(2,1),c(1,2))
เนื่องจากปัญหานี้กำลังพูดถึงพาร์ติชันพิเศษเหนือทั้งชุด
ฉันแสดงรายการการเรียงลำดับที่แตกต่างกันบางรายการลงในรายการ lst
ด้านล่าง
lst <- list(list(1,c(2,3,4),c(5,6),7),
list(c(2,3,4),1,7,c(5,6)),
list(1,c(2,3,4),7,c(6,5)),
list(7,1,c(3,2,4),c(5,6)))
และสิ่งที่ฉันต้องการทำคือการตรวจสอบว่าพีชคณิตทั้งหมดมีความเท่าเทียมกัน TRUE
ถ้าใช่แล้วเราจะได้รับผล
สิ่งที่ฉันทำจนถึงตอนนี้คือการจัดเรียงองค์ประกอบภายในแต่ละพาร์ติชันและใช้setdiff()
กับinterset()
และunion()
ตัดสินมัน (ดูรหัสของฉันด้านล่าง)
s <- Map(function(v) Map(sort,v),lst)
equivalent <- length(setdiff(Reduce(union,s),Reduce(intersect,s),))==0
อย่างไรก็ตามฉันคิดว่าวิธีนี้จะช้าเมื่อใดก็ตามที่ขนาดพาร์ติชันเพิ่มขึ้น มีวิธีเร็วกว่าที่จะทำหรือไม่ ขอบคุณล่วงหน้า!
- กรณีทดสอบบางอย่าง (ข้อมูลขนาดเล็ก)
# should return `TRUE`
lst1 <- list(list(1,c(2,3,4),c(5,6)),
list(c(2,3,4),1,c(5,6)),
list(1,c(2,3,4),c(6,5)))
# should return `TRUE`
lst2 <- list(list(1:2, 3:4), list(3:4, 1:2))
# should return `FALSE`
lst3 <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
lst_equal = list(list(1:2, 3:4), list(3:4, 1:2))
และยังเป็นหนึ่งที่ผลที่ควรจะFALSE
บางทีlst_false <- list(list(1,c(2,3,4),c(5,6)), list(c(2,3,4),1,c(5,6)), list(1,c(2,3,5),c(6,4)))
FALSE
รวมทั้งบางส่วนที่ผลที่คาดหวังคือ ด้วยวิธีนี้เมื่อคำตอบใช้งานได้ในบางกรณี แต่ไม่ใช่ทั้งหมดกรณีทดสอบมันง่ายที่จะวินิจฉัยว่าทำไม เมื่อมีเพียงตัวอย่างเดียวคุณจะเสียความแตกต่างเล็กน้อยในผลการทดสอบ นอกจากนี้ยังเป็นการดีที่จะเพิ่มตัวอย่างใหม่แทนที่จะเปลี่ยนตัวอย่างที่มีอยู่ภายใต้คนที่ทำงานกับพวกเขาแล้ว
lst
อาจยาวนานคุณอาจเพิ่มประสิทธิภาพด้วยวิธีการอื่น เช่นการตรวจสอบครั้งแรกที่length(unique(lengths(lst))) == 1
จะกลับมาอย่างรวดเร็วมากFALSE
หากรายการด้านในมีจำนวนองค์ประกอบที่ไม่ถูกต้อง ....
lst
เปรียบเทียบlst[[i]]
กับlst[[1]]
และวิธีที่คุณสามารถหยุดทันทีที่คุณพบความไม่ตรงกันแทนที่จะทำการเปรียบเทียบทั้งหมด หากlst
เป็นเวลานานและFALSE
เป็นเรื่องปกตินี่อาจเป็นการเพิ่มประสิทธิภาพอย่างมาก แต่ก็อาจไม่คุ้มกับที่อื่น
Map
โทรหลายสาย