ผมขอยกภาษาที่ถนัดสุดละกัน คือ PHP
สมมติผมมี array 1 ชุด
$ar = array('A','B','D','E');
มันก็จะเป็น $ar[1],......
ทีนี้ ถ้าผมอยากเอา $ar[2] ออกงี้
หรือจะเพิ่มค่า C ลงไปหลัง B
ก็จะกลายเป็น $ar[2]=C ตัวอื่นๆ ก็จะถูกจัดเรียง index ใหม่แบบอัตโนมัติ
"ทำไมถึงไม่มีคำสั่งเอาออกในตำแหน่งนั้นๆ โดยตรง และเรียง index ให้เลยครับ"
ทำไมต้อง push, pop อะไรพวกนี้
หรือจริงๆ แล้วมี แต่ผมไม่รู้ @_@
สาเหตุที่ทำให้มันไม่สามารถเอาออกได้ดื้อๆ เป็นเพราะอะไร (ไม่เอาเรื่อง data structure)
ศึกษา Data Structure ครับ
tukzazaza Sat, 31/03/2012 - 20:46
ศึกษา Data Structure ครับ Array มันเป็นพื้นฐาน
จะแทรกอะไรแบบนั้น ลองดูพวก List ครับ ไม่รู้ PHP มีหรือป่าว ไม่ถนัดครับ
คือผมหมายถึง
nevermore Sat, 31/03/2012 - 21:23
คือผมหมายถึง สาเหตุที่ไม่สามารถแทรกเข้าไปได้อ่ะครับ
บางที ที่มันไม่มี
heart Sat, 31/03/2012 - 22:14
In reply to คือผมหมายถึง by nevermore
บางที ที่มันไม่มี ก็เพราะมันแค่ไม่มี
แต่ว่าเราก็ยังสามารถทำได้ด้วยคำสั่งอื่นๆหลายคำสั่งแทน
ทำให้ไม่มีการพัฒนาจุดนั้นขึ้นมา
คงไม่มีเหตุผลเชิงวิชาการหรอกครับ ว่าทำไมถึงไม่มี
อันที่จริงภาษาโปรแกรมทุกภาษา ก็มีอีกหลายอย่าง ที่ไม่มี และก็ไม่มีเหตุผลเชิงวิชาการมาบอก ว่าทำไมถึงไม่มี
แต่โดยทั่วไป เราก็ใช้คำสั่งอื่นๆ มาประยุกต์เพื่อให้สามารถได้ผลลัพธ์ที่ต้องการได้
หากใครเขียน PHP มานานๆจะรุ้ว่า PHP มักจะมีคำสั่งสำเร็จรูปอยู่จำนวนมาก (ยกตัวอย่างเช่น mail() )
ซึ่งถ้าถามว่า ภาษาอื่นทำไมถึงไม่มีหละ คำตอบก็คือ ก็เพราะแค่มันไม่มีเฉยๆ
หลายๆคำสั่งใน PHP นั้น สามารถทำงานได้ด้วยคำสั่งเดียว แต่ในอีกหลายภาษานั้นก็ไม่มีคำสั่งสำเร็จรูปแบบ PHP
สรุปแล้ว ผมว่า ที่มันไม่มี ก็เพราะแค่ว่า มันไม่มี เฉยๆ
+1 บางอย่างไม่ใช่ทำไม่ได้
mementototem Sat, 31/03/2012 - 22:58
In reply to บางที ที่มันไม่มี by heart
+1
บางอย่างไม่ใช่ทำไม่ได้ แต่ไม่ทำ เพราะไม่อยากทำ และไม่เห็นความจำเป็นต้องทำ
+1
incredibles Sun, 01/04/2012 - 19:36
In reply to บางที ที่มันไม่มี by heart
+1 อยากให้พวกที่เถียงกันว่าภาษาไหนดีกว่ากันมาอ่าน comment นี้จัง
ผมก็คิดไปไกล ไปโน่น
nevermore Sat, 31/03/2012 - 23:13
ผมก็คิดไปไกล ไปโน่น เกี่ยวกับเรื่องหน่วยความจำ
คิดไกลไปหน่อยใช่มั้ยครับ
ลอง unset($ar[2]); ดูครับ
lancaster Sat, 31/03/2012 - 23:19
ลอง unset($ar[2]); ดูครับ
ถ้าไม่เอาเรื่อง data
mibtrex Sat, 31/03/2012 - 23:21
ถ้าไม่เอาเรื่อง data structure ก็คงต้องพูดกันในเรื่องของ compiler ครับ ว่าการออกแบบตัวแปรชนิด array มันเป็นการจอง memory ของข้อมูลในตำแหน่งของ address ที่ติดกัน เพราะฉะนั้น การที่จะเอาออกแบบนั้นมันจะทำให้ เกิดช่องว่างระหว่าง address ซึ่งถ้าจะให้เรียง index ใหม่ ก็ต้องขยับข้อมูลเอาไปแทนที่ข้อมูลเดิมที่เอาออก
ปัญหามันจะอยู่ตรงที่ถ้าข้อมูลเรายาวมากๆ การขยับแต่ละครั้งมันจะเปลือง performance มากๆ ก็เลยมีการคิดการเก็บข้อมูลอย่างอื่นเช่นพวก linklist ทำให้เอาออก หรือแทรกได้โดยไม่เปลือง performance มากนัก
ขอเพิ่มเติมแล้วกันครับ ถ้าเป็
PiKO Sat, 31/03/2012 - 23:43
ขอเพิ่มเติมแล้วกันครับ
ถ้าเป็น Array ในภาษา C มันจะเป็น Memory ผืนเดียวกันยาวๆ เพราะฉะนั้น การแทรกกลาง หรือการลบเฉพาะแค่ตรงกลาง มันไม่ค่อยสมเหตุสมผลเท่าไหร่ครับ และ PHP ก็อาจจะได้ผลมาจากคนที่เคยเขียนภาษา C จะรู้สึกแปลกๆ ที่จะแทรกข้อมูลลงไปใน Array ก็เลยไม่มีก็เป็นได้ :)
แต่สำหรับ PHP แค่ลบใช้รู้สึกจะใช้ unset() ตามคุณ lancaster บอกได้
เหตุผล (ที่ไม่ใช่เชิง data
neizod Sun, 01/04/2012 - 02:55
เหตุผล (ที่ไม่ใช่เชิง data structure) คือ คนสร้างภาษาเค้าไม่ได้ใช้ฟังก์ชันนั้น เลยไม่ได้เขียนไว้ให้เราใช้ครับ
ผมยกตัวอย่าง Python ที่ไม่มีข้อมูลแบบ array ให้ใช้ แต่มี list ซึ่งสามารถทำงานได้เหมือนกัน และน่าจะมีความสามารถอย่างที่คุณถาม
{syntaxhighlighter class="brush: python"}
l = ['a', 'b', 'd', 'e']
l[2:2] = ['c']
print(l)
get: ['a', 'b', 'c', 'd', 'e']
l[1:2] = []
print(l)
get: ['a', 'c', 'd', 'e']
{/syntaxhighlighter}
ถ้าตามความคิดผม คำสั่งใน C
heart Sun, 01/04/2012 - 03:03
ถ้าตามความคิดผม
คำสั่งใน C แต่ละคำสั่ง ก็ถูกแปลงเป็นภาษาเครื่องอยู่แล้ว ซึ่งคำสั่งจาก C หนึ่งคำสั่งนั้น
อาจจะถูกแปลงเป็นภาษาเครื่อง หลายคำสั่งรวมกันก็ได้
(assembly Move ไป Move มา หลายๆครั้งรวมๆกัน เป็นเรื่องปรกติอยู่แล้ว)
ดังนั้น ถ้า C จะทำคำสั่งให้สามารถแทรก array ได้ก็ไม่ใช่เรื่องยาก
และหาก C มีคำสั่งนั้นจริงๆ คำสั่งนั้น มันก็จะทำงานเร็วกว่าการใช้คำสั่งหลายๆคำสั่งใน C มารวมกัน
เพื่อประยุกต์ให้แก้ปัญหานี้ได้ แน่นอน
เพราะว่า ถ้าภาษา C หนึ่งคำสั่ง แปลงเป็นภาษาเครื่องชุดเล็กๆ
น่าจะรวมแล้วเล็กกว่า คำสั่ง C หลายๆคำสั่งรวมกัน
ดังนั้นเหตุผลว่า เพราะเปลืองทรัพยากร คงจะไม่ใช่ หรือความยากในการเขียน ก็คงจะไม่ใช่
เพราะผมรับรองว่า คำสั่ง for , if , while นั้นแปลงเป็นภาษาเครื่อง ยุ่งยากกว่าการย้าย array แน่นอน
เหตุผลที่ไม่มีก็คือ นักพัฒนาไม่สามารถทำทุกอย่างได้
ไม่เช่นนั้น นักพัฒนาอาจจะต้องใช้เวลาเป็นสิบปี เพื่อเก็บตกคำสั่งเล็กน้อยทั้งหมดไม่ว่ามันจะคืออะไรก็ตามแต่
แต่การพัฒนาคำสั่งพื้นฐาน ที่สามารถนำมาประยุกต์ได้หลากหลายนั้น น่าจะเป็นทางเลือกที่ดีที่สุด
แต่ภาษาในปัจจุบัน เช่น C# หรือ C++ หรือ Java นั้นก็ถูกพัฒนามาจากการเรียนรู้ในอดีต
หลายๆฟังชั่น ที่อดีตไม่เคยมี โปรแกรมเมอร์ในอดีตต้องใช้คำสั่งที่ยุ่งยาก เพื่อแก้ปัญหา
พอมาถึงยุคใหม่ ก็ถูกแทนที่ด้วยคำสั่งใหม่ที่มาแก้ปัญหาเหล่านั้น
ผมเชื่อว่า หากคุณพิสูจน์ได้ว่า คำสั่งแทรก array ตรงกลางนั้น ควรค่าแก่การถูกพัฒนาขึ้นมาจริงๆ
ภาษาในยุคต่อไป ก็จะมีคำสั่งนี้แน่นอน
จะทำให้มันเรียงข้อมูลทุกครั้ง
soginal Sun, 01/04/2012 - 04:19
จะทำให้มันเรียงข้อมูลทุกครั้งที่ add ข้อมูลใหม่ไปก็ได้ครับ แต่มันจะมีกระบวนการเพิ่มขึ้นมากกว่าเดิมและทำให้ช้าลงเมื่อข้อมูลมีจำนวนมาก และ object (เช่นพวก class, struct, array) จะไม่สามารถ sort ได้อย่างถูกต้อง โปรแกรมเมอร์ต้องเป็นคนใส่เงื่อนไขการ sort เข้าไปเอง
ดังนั้นจึงไม่ได้ใส่กระบวนการเรียงข้อมูลเข้าไปใน array หากต้องการ sort ก็เรียกใช้ function สำหรับ sort เอาเองจะดีกว่า
อนึ่ง ผมคิวว่าคงจะป่วยการ
neizod Sun, 01/04/2012 - 04:36
อนึ่ง ผมคิวว่าคงจะป่วยการ ถ้าจะพูดกันเรื่องนี้ทั้งที แต่กลัว data structure (จะกลัวไปทำไม?)
array แต่เดิมในภาษา C นั้น (เหมือนที่คุณ PiKO อธิบาย) เป็นการเก็บข้อมูลชุดหลายๆ ตัวอย่างง่ายที่สุด มันเกิดจากการจองพื้นที่เป็นบล๊อกติดๆ กันไว้จำนวนหนึ่ง แล้วก็ใส่ข้อมูลอย่างเรียงลำดับลงไปในแต่ละบล๊อก ส่วนตัวแปรต้นของมันนั้นจะเก็บที่อยู่ของบล๊อกแรกสุดเอาไว้ ถ้าเราต้องการเข้าไปหาข้อมูลที่ตัวไหน ก็เอาที่อยู่แรกสุด มาบวกเพิ่มกับขนาดของบล๊อกที่เราจะไป เราก็จะเจอข้อมูลตัวที่เราหานั่นเอง
แต่การ implement แบบนี้ ก็มีข้อเสียที่การเอาข้อมูลตัวตรงกลางๆ ออกใช้เวลามาก เพราะเราไม่สามารถปล่อยให้เหลือช่องว่างอยู่ภายใน array ได้ จึงมี linked list ขึ้นมา ซึ่งคราวนี้บล๊อกแต่ละบล๊อกไม่จำเป็นต้องอยู่ใกล้กันแล้ว แต่บล๊อกต่างๆ จะเก็บข้อมูลเพิ่มขึ้นมาคือที่อยู่ของตัวถัดไป ถ้าเราต้องการเข้าไปหาตัวลึกๆ จะเสียเวลามากหน่อยเพราะต้องเริ่มเข้าตั้งแต่ต้นทาง แล้วก็ถามหาตัวถัดไปเรื่อยๆ ข้อดีของวิธีนี้คือ การเอาตัวกลางๆ ออกจะเร็ว เพราะเราก็แค่บอกตัวก่อนหน้าให้เปลี่ยนที่อยู่ชี้ไปยังตัวถัดไปจากเราซะ ไม่ต้องเลื่อนตัวที่เหลือให้เขยือบเข้ามา
จากข้อเสียของ linked list ที่แม้จะเอาตัวกลางๆ ออกได้ไวก็จริง แต่การเข้าไปหาตัวกลางๆ ก็กินเวลามาก (เพราะเราไม่รู้ว่ามันอยู่ตรงไหนกันแน่จนกว่าจะถามทางตัวแรกสุดมาจนครบ) ก็มีวิธี implement แบบ hash table ขึ้นมา ซึ่งมันรับประกันความเร็วในการเข้าถึงข้อมูลตัวต่างๆ ว่าจะใช้เวลาเท่ากันหมด โดยมันจะนำชื่อที่อยู่ที่เราอ่านออก (เช่น ตำแหน่งที่ 0, 1, 2, a, b, c...) ไปเข้าอัลกอริทึม hash ซึ่งจะให้ผลออกมาเป็นตัวเลขที่ดูเหมือนว่ามั่วๆ สะเปะสะปะ (เช่น 0 -> 15, 1 -> 7, 2 -> 13, a -> 8) แล้วก็เก็บข้อมูลลงไปเหมือนกับ array ธรรมดาที่ยอมมีช่องว่างของตัวที่ไม่ใช้
แต่ข้อเสียของ hash table คือ ข้อมูลในนั้นจะไม่ถูกจดจำอย่างเรียงลำดับ (โดยคอมพิวเตอร์) เช่น เวลาเราพูดถึง 0 คอมพิวเตอร์จะมองเห็นว่ามันอยู่ตำแหน่งที่ 15 แทน
และนี่ก็น่าจะเป็นฝันร้ายของ PHP โปรแกรมเมอร์ เพราะ array ใน PHP แท้จริงแล้วมันคือ hash table นั่นเอง แม้ว่าเราจะ unset index ตำแหน่งตรงกลางๆ ของ array ไปแล้ว แต่กลับกลายเป็นว่าช่องนั้นจะโหว่ไปเลย index ตัวที่มากกว่าจะไม่ถูกเลื่อนลงมาให้ครับ
เยอะเลย.......ความรู้ทั้งนั้น
nevermore Sun, 01/04/2012 - 22:28
เยอะเลย.......ความรู้ทั้งนั้น บางอย่างผมก็ไม่เคยทราบจริงๆ
ขอบคุณทุกท่านมากครับ
ไม่แน่ใจว่าเข้าใจถูกหรือเปล่า
eakjaa Sun, 01/04/2012 - 22:44
ไม่แน่ใจว่าเข้าใจถูกหรือเปล่า php จะมีคำสั่งให้สามารถเพิ่ม แทนที่หรือลบค่าใน array ที่อยู่ตรงกลางได้ครับ คือ array_splice()
http://th.php.net/manual/en/function.array-splice.php
ถ้าไม่ตรงกับที่ต้องการต้องขอโทษด้วยนะครับ
แหม่ ....
PaPaSEK Mon, 02/04/2012 - 10:28
In reply to ไม่แน่ใจว่าเข้าใจถูกหรือเปล่า by eakjaa
แหม่ .... กำลังจะมาพิมพ์เลยครับ :P array_splice() นี่คนรู้จักน้อย ยิ่งถ้าไม่เคยเปิด reference เลยก็ไม่รู้จักแน่นอน
ฝากถึงคุณ nevermore ผมไม่รู้ว่าผมสอนจระเข้ว่ายน้ำหรือเปล่า
ผมอ่าน PHP reference เป็นงานอดิเรก ... แล้วก็ภาษาอื่นๆ ที่ผมต้องใช้ด้วย ฟังก์ชันบางอย่างมันมี แต่คุณไม่รู้ บางอย่างก็ไม่มีต้องใช้ workaround ช่วยครับ
ใน PHP reference ยังมีตัวอย่างดีๆ พร้อมคำอธิบายที่มาที่ไปของ argument (so, my argument is never invalid) ถ้าอ่านให้ครบๆ (อ้างอิง, see also, link ในส่วนต่างๆ ฯลฯ) จะเข้าใจการทำงานของฟังก์ชันต่างๆ เป็นอย่างดีอีกด้วยครับ
array_splice()
nevermore Mon, 02/04/2012 - 16:57
In reply to แหม่ .... by PaPaSEK
array_splice() ผมไม่เคยใช้จริงๆ นะ เพิ่งจะเห็นนะครับ
Mannual ผมเข้าเป็นปกติตลอดเลย แต่ไม่เคยเปิดดูเลย ส่วนใหญ่ก็ใช้แต่เดิมๆ ตลอด
ลองเปิดดูฟังก์ชั่นเกี่ยวกับ
PaPaSEK Tue, 03/04/2012 - 14:55
In reply to array_splice() by nevermore
ลองเปิดดูฟังก์ชั่นเกี่ยวกับ array ทั้งหมดดูครับ ไล่อ่านทีละอันเลย
PHP มีฟังก์ชันหยุมหยิม ยิบย่อยให้ใช้งานเยอะมากครับ
ล่าสุดผมเพิ่งจะได้ใช้
nevermore Tue, 03/04/2012 - 18:53
In reply to ลองเปิดดูฟังก์ชั่นเกี่ยวกับ by PaPaSEK
ล่าสุดผมเพิ่งจะได้ใช้ preg_replace_callback() เพิ่งจะรู้ว่ามันมีอีกด้วย
"ทำไมถึงไม่มีคำสั่งเอาออกในตำ
Invisible Force Mon, 02/04/2012 - 17:04
"ทำไมถึงไม่มีคำสั่งเอาออกในตำแหน่งนั้นๆ โดยตรง และเรียง index ให้เลยครับ"
สั้นๆ คือ เรื่องประสิทธิภาพของโปรแกรมครับ (ซึ่งจะเห็นชัดเมื่อมีการใช้งานบ่อยๆ หรือ ใชักับข้อมูลขนาดใหญ่)
เราสามารถที่จะเขียนฟังก์ชั่นขึ้นมาเฉพาะเพื่ออำนวยความสะดวกในการเรียกใช้งานง่ายๆ ตามที่ตัวอย่างนี้ต้องการก็ได้ครับ .. ซึ่งถ้าเขียนใช้เองมันก็ไม่มีปัญหาอะไร .. แต่ถ้าดันเขียนแล้วปล่อยเผยแพร่ให้คนอื่นใช้ มันก็ต้องมี algorithm ที่ดีหน่อยมันจะได้ไม่อายเค้าครับ ^^
คนมาตอบกันเยอะมาก ^^
boykeng Wed, 04/04/2012 - 18:22
คนมาตอบกันเยอะมาก ^^