>> DAVID เจลัน: ทั้งหมดขวา
ดังนั้นยินดีที่จะเป็นครั้งแรกที่ การชันสูตรศพ CS50 การทดสอบ
เราคิดว่าเราจะทำพิธีเปิด ประเพณีนี้ในปีนี้
และนี่จะเป็นโอกาส จะเดินผ่าน
การแก้ปัญหาที่จะตอบคำถาม
และเราจะเร็วขึ้นหรือช้าลงตาม ในความสนใจของคนเหล่านั้นที่นี่
>> ดังนั้นคุณอาจจะที่นี่เพราะคุณ ที่สนใจในวิธีการที่คุณอาจมีหรือ
ควรจะมีคำตอบบางอย่าง ปัญหาเหล​​่านี้
ดังนั้นเราไม่ใช้เวลาดูว่าทำไม ที่ส่วนนี้เป็นอันดับแรก
เพื่อรับสาย
เรื่องนี้ทำให้คุณสามรุ่นที่แตกต่างกัน ของโปรแกรมที่เป็นที่สุด
หมายถึงการได้รับสายจากผู้ใช้
หรือไม่ก็ไม่ว่าเป็น ที่เหลืออยู่กับคุณเพื่อตรวจสอบ
>> และเราถามคำถาม 0 คิดว่ารุ่นที่ 1
รวบรวมและดำเนินการ
ทำไมอาจโปรแกรม segfault?
ได้อย่างรวดเร็วก่อนคำแนะนำใด ๆ ว่าทำไม?
ใช่
>> ผู้ชม: ดังนั้นผมจำได้ว่าเห็นใน ตัวอย่างก่อนหน้านี้ในการมอง
* s ถ่านและเห็นสแกน s และ เห็นเพราะมันเป็นตัวชี้ว่า
มันส่งผลกระทบต่อสิ่งที่คุณสแกนอะไรบ้าง?
มันหรือที่อยู่ของ s หรือไม่
>> DAVID เจลัน: OK
ดี
ดังนั้นในที่สุดแหล่งที่มาของปัญหาใด ๆ มีการสันนิษฐานว่าจะลด
ที่ตัวแปร
และมันก็เป็นตัวแปรที่แน่นอน
ชนิดข้อมูลของตัวแปรที่เป็น char * ซึ่งหมายความว่ามันจะ
มีที่อยู่ของตัวละคร
และข้อมูลเชิงลึกที่อยู่ในนั้น
มันจะมีที่อยู่ของ ตัวอักษรหรือมากกว่าปกติ
ที่อยู่ของอักขระตัวแรกใน บล็อกทั้งหมดของตัวละคร
>> แต่จับคือการสแกน s วัตถุประสงค์ใน ชีวิตจะได้รับที่อยู่และได้รับการ
รหัสรูปแบบเช่น% s อ่าน สตริงเป็นก้อน
หน่วยความจำที่อยู่ที่
แต่เพราะไม่มีเครื่องหมายเท่ากับก่อน อัฒภาคในวันแรกที่
บรรทัดของรหัสเพราะเราทำไม่ได้จริง จัดสรรหน่วยความจำใด ๆ กับ
malloc เพราะมันไม่ได้จริง จัดสรรอาร์เรย์ที่มีขนาดบางทั้งหมด
ที่คุณกำลังทำคือการอ่านของผู้ใช้ ใส่แป้นพิมพ์เป็นบางสมบูรณ์
ค่าขยะซึ่ง อยู่ในโดยค่าเริ่มต้น
ดังนั้นโอกาสที่คุณกำลังจะ segfault ถ้า ที่อยู่ที่ไม่เพียงเพื่อให้เกิดขึ้น
เป็นค่าที่คุณสามารถให้ ในความเป็นจริงเขียนถึง
ดังนั้นไม่ดีไม่ได้ในการจัดสรร หน่วยความจำของคุณมี
>> ดังนั้นในคำถามที่ 1 เราถามว่า คิดว่า 2 รุ่นคือ
รวบรวมและดำเนินการ
ทำไมโปรแกรมนี้อาจ segfault?
ดังนั้นหนึ่งนี้เป็นรถน้อย
และมีเพียงคนเดียวจริงๆ วิธีที่ชัดเจนที่คุณสามารถ
เรียก segfault ที่นี่
และนี่คือใจ
เวลาที่เรากำลังใช้คในความทรงจำใด ๆ สิ่งที่ คุณอาจจะก่อให้เกิดการ segfault
กับรุ่น 2?
>> ผู้ชม: ถ้าคุณใช้ข้อมูลที่อยู่ใน สตริงที่ยาวกว่า 49
ตัวอักษร
>> DAVID เจลัน: แน่นอน
เวลาที่คุณเห็นบางสิ่งบางอย่างคงที่ยาว ๆ เมื่อมันมาถึงอาร์เรย์ของคุณ
เรดาร์ควรจะไปปิดที่นี้อาจจะ ปัญหาหากคุณไม่ได้ตรวจสอบ
ขอบเขตของอาร์เรย์
และนั่นคือปัญหาที่นี่
เรายังคงใช้ scanf
เรายังคงใช้% s ซึ่งหมายความว่าพยายาม อ่านสตริงจากผู้ใช้
ที่จะได้รับการอ่านใน s ซึ่ง ณ จุดนี้เป็นอย่างมีประสิทธิภาพ
ที่อยู่ของหน่วยความจำอัน หรือเทียบเท่า
มันเป็นชื่อของอาร์เรย์ ของตัวละครของหน่วยความจำ
>> แต่ตรงที่ถ้าคุณอ่านสตริง ที่ยาวกว่า 49 ตัวอักษร 49
เพราะคุณจะต้องมีที่ว่างสำหรับเครื่องหมาย 0 คุณกำลังจะล้น
บัฟเฟอร์ที่
และคุณอาจได้รับโชคดีและสามารถที่จะ เขียนตัวอักษรที่ 51, 52, 53
แต่ในบางจุด, ระบบปฏิบัติการ เป็นไปที่จะบอกว่าไม่มี
นี้แน่นอนไม่ได้เป็นหน่วยความจำ คุณได้รับอนุญาตให้สัมผัส
และโปรแกรมจะไป segfault
>> จึงมี, วิเคราะห์พฤติกรรมที่ควรจะใด เวลาที่คุณมีความยาวคงที่คุณมี
ให้แน่ใจว่าคุณกำลังตรวจสอบความยาว ของสิ่งที่เป็นคุณกำลังพยายาม
การอ่านเป็นมัน
>> ผู้ชม: ดังนั้นการแก้ปัญหาที่คุณสามารถ มีคำสั่งการตรวจสอบจริง
เป็นระยะเวลามากขึ้น มากกว่าหรือน้อยกว่า
>> DAVID เจลัน: แน่นอน
คุณเพียงแค่ต้องมีเงื่อนไข ที่บอกว่าถ้า -
หรือมากกว่าที่คุณไม่จำเป็นต้องรู้ ล่วงหน้าจำนวนตัวอักษร
ผู้ใช้จะพิมพ์เพราะ คุณมีไก่และไข่
ไม่ได้จนกว่าคุณจะได้อ่านมันด้วย scanf คุณสามารถคิดออกว่ามันยาวเป็น
แต่ในจุดนั้นมันจะสายเกินไป เพราะคุณได้อ่านแล้วมันลงไปใน
บล็อกของหน่วยความจำบางส่วน
เพื่อที่จะกันหลีกเลี่ยงห้องสมุด CS50 ปัญหานี้ทั้งหมดจำ
โดยใช้ fgetc
และจะอ่านตัวละครตัวหนึ่งที่เวลา ปลาย toeing พร้อมรู้ว่าคุณ
ไม่สามารถล้นตัวละครถ้า คุณอ่านในช่วงเวลาหนึ่ง
>> จับอยู่กับการเรียกคืน GetString เป็น ที่เรามีอย่างต่อเนื่องอีกครั้งขนาด
อันที่ของหน่วยความจำที่ เป็นเพียงความเจ็บปวด
มันมากบรรทัดของ รหัสที่จะทำ
ดังนั้นวิธีการอื่นที่จะ ใช้จริงญาติดังนั้น
การพูดของ scanf
มีสายพันธุ์จำนวนมากของเหล่านี้เป็น ฟังก์ชั่นที่ตรวจสอบจริง
ความยาวของจำนวนตัวอักษร คุณอาจจะอ่านที่สุด
และคุณสามารถระบุไม่ได้อ่าน กว่า 50 ตัวอักษร
เพื่อที่จะเป็นอีกวิธีหนึ่ง แต่ รองรับน้อยของปัจจัยการผลิตขนาดใหญ่
>> ดังนั้นคำถามที่ 2 ถามว่าคิดว่ารุ่นที่ 3 จะรวบรวมและดำเนินการ
ทำไมโปรแกรมที่อาจ segfault?
ดังนั้นหนึ่งนี้เป็นจริงเดียวกัน ตอบแม้ว่ามัน
ดูเหมือนนักเล่นน้อย
เรากำลังใช้ malloc ซึ่งรู้สึกเหมือน เราให้ตัวเองเลือกมากขึ้น
และจากนั้นเราจะพ้นที่ หน่วยความจำที่สิ้นสุด
ก็ยังคงเพียง 50 ไบต์ของหน่วยความจำ
ดังนั้นเราจึงยังคงพยายามที่จะอ่าน ใน 51, 52, 1,000 ไบต์
มันจะ segfault เพื่อ ว่าด้วยเหตุผลเดียวกัน
>> แต่มีเหตุผลอื่นเกินไป
อะไรที่สามารถ malloc ผลตอบแทนนอกเหนือจาก ที่อยู่ของหน่วยความจำอัน?
มันอาจกลับมาเป็นโมฆะ
และเพราะเราไม่ได้ตรวจสอบ ที่เราอาจจะทำอะไรบางอย่าง
โง่ด้วยเหตุผลอื่นซึ่งเป็นที่ เราอาจจะบอก scanf อ่าน
ข้อมูลของผู้ใช้จากแป้นพิมพ์ 0 เป็นสถานที่ AKA null
และที่เกินไปอย่างแน่นอน เรียก segfault
ดังนั้นเพื่อวัตถุประสงค์ในการทดสอบของเราจะ ได้รับการยอมรับอย่างใดอย่างหนึ่งของผู้ที่เป็น
เหตุผลที่ถูกต้อง
หนึ่งคือเหมือนกัน
หนึ่งเป็นเพียงเล็กน้อยที่เหมาะสมยิ่งขึ้น
>> สุดท้ายด้วยความเคารพในการเขียนโปรแกรมของ ใช้หน่วยความจำอย่างไร 2 รุ่นและ
3 รุ่นที่แตกต่างกัน?
ดังนั้นสำหรับสิ่งที่คุ้มค่าเราเห็น อุปทานดูเหมือนไม่มีที่สิ้นสุดของความเป็นไปได้
คำตอบนี้
และในหมู่คนตอบสิ่งที่เรามี หวัง แต่เราได้รับการยอมรับอื่น ๆ
สิ่งที่เป็นที่กล่าวถึงของบางอย่าง ความจริงที่ว่ารุ่นที่ 2 คือการใช้
ที่เรียกว่าสแต็ค
3 รุ่นจะใช้กอง
และหน้าที่นี้ไม่ได้จริงๆ ทำให้สิ่งที่แตกต่างกันมาก
ในตอนท้ายของวันที่เรายังคง แค่ 50 ไบต์ของหน่วยความจำ
>> แต่นั่นก็เป็นหนึ่งในคำตอบที่เป็นไปได้ ที่เรากำลังหาที่
แต่คุณจะเห็นที่คุณได้รับแบบทดสอบของคุณ กลับมาจาก TFs ที่เราได้
ยอมรับการอภิปรายอื่น ๆ ของพวกเขา การใช้แตกต่างกันของหน่วยความจำได้เป็นอย่างดี
แต่กองและกองจะได้รับ คำตอบง่ายที่จะไปกับ
คำถามใด?
ผมให้คุณร็อบ
>> ROB สลิง: ดังนั้นปัญหา 4
นี้เป็นหนึ่งในสถานที่ที่คุณต้องกรอก ในจำนวนไบต์ที่ออกจากทั้งหมด
ชนิดที่แตกต่างกันเหล่านี้ใช้
ดังนั้นสิ่งแรกที่เราเห็น
สมมติสถาปัตยกรรม 32 บิต เช่นเครื่องใช้ CS50 นี้
ดังนั้นหนึ่งในสิ่งพื้นฐานเกี่ยวกับ สถาปัตยกรรม 32 บิตที่บอกเรา
ว่าวิธีการใหญ่ตัวชี้เป็นไป ที่จะอยู่ในสถาปัตยกรรม
>> ดังนั้นทันทีที่เรารู้ว่าตัวชี้ใด ๆ ประเภทเป็น 32 บิตหรือ 4 ไบต์
ดังนั้นมองไปที่ตารางนี้ * โหนดเป็นประเภทตัวชี้
ที่จะเป็น 4 ไบต์
โหนด struct * ที่แท้จริง เหมือนดาวโหนด
และเพื่อให้เป็นไปได้ 4 ไบต์
สตริงจึงดูไม่เหมือน ชี้ แต่ typedef,
สตริงเป็นเพียงถ่าน * ซึ่ง เป็นประเภทตัวชี้
เพื่อที่จะเป็น 4 ไบต์
>> ดังนั้นทั้งสามมีทั้งหมด 4 ไบต์
ตอนนี้โหนดและนักเรียนมี บิตซับซ้อนมากขึ้น
ดังนั้นการมองหาที่โหนดและนักเรียนที่เราเห็น โหนดเป็นจำนวนเต็มและตัวชี้
และนักเรียนเป็นสองตัวชี้ ภายในของมัน
ดังนั้นอย่างน้อยสำหรับกรณีของเราที่นี่วิธี ที่เราจบลงด้วยการคำนวณขนาดของ
struct นี้เป็นเพียงการเพิ่มขึ้นทุกอย่าง ที่อยู่ภายใน
>> ดังนั้นสำหรับโหนดเรามีจำนวนเต็ม ซึ่งเป็น 4 ไบต์
เรามีตัวชี้ซึ่งเป็น 4 ไบต์
และดังนั้นหนึ่งโหนดเป็นไป ที่จะใช้เวลาถึง 8 ไบต​​์
และเช่นเดียวกันสำหรับนักเรียนเรามี ตัวชี้ที่ 4 ไบต์และอีก
ตัวชี้ที่ 4 ไบต์
เพื่อที่จะจบ ขึ้นเป็น 8 ไบต​​์
ดังนั้นโหนดและนักเรียนมี 8 ไบต​​์
และทั้งสามมีทั้งหมด 4 ไบต์
คำถามที่
ใช่
>> ผู้ชม: มันเป็น 64 บิต สถาปัตยกรรมจะว่า
สองทั้งหมดของพวกเขา
>> ROB สลิง: มันจะไม่ สองทั้งหมดของพวกเขา
ดังนั้นสถาปัตยกรรม 64 บิตมันอีกครั้ง การเปลี่ยนแปลงที่สิ่งพื้นฐานที่
ชี้เป็น 64 บิต
ใช่
ดังนั้นตัวชี้คือ 8 ไบต​​์
ดังนั้นเหล่านี้ที่มี 4 ไบต์ จะไปเป็น 8 ไบต​​์
นักศึกษาซึ่งเป็นสองตัวชี้ ดีตอนนี้มันจะ
เป็น 8 ไบต​​์ 8 ไบต​​์
มันจะทำให้ 16 ไบต์
>> แต่โหนดยังคงเป็น 4 ไบต์
ดังนั้นตัวชี้นี้เป็นไป เป็น 8 ไบต​​์
นี้เป็น 4 ไบต์
ดังนั้นโหนดเพียงจะ จะเป็น 12 ไบต์
คำถามอื่นใดที่หนึ่ง?
ดังนั้นหนึ่งต่อไปเหล่านี้เป็น รหัสสถานะ HTTP
และคุณจะต้องอธิบายสถานการณ์ ซึ่งอยู่ภายใต้อำนาจของเหล่านี้
กลับสู่คุณ
ปัญหาหนึ่งที่ผมได้ยินนักเรียนบางคน มีอยู่ว่าพวกเขาพยายามที่จะทำให้
ข้อผิดพลาดจะอยู่ในช่วงปลายของลูกค้า
ดังนั้นเมื่อเราพยายามที่จะทำตามคำขอ ไปยังเซิร์ฟเวอร์บางสิ่งบางอย่างไป
ที่ไม่ถูกต้องในส่วนของเรา
แต่โดยทั่วไปเหล่านี้เป็นรหัส ถูกส่งกลับโดยเซิร์ฟเวอร์
ดังนั้นเราจึงต้องการที่จะคิดออกว่าเกิดอะไรขึ้น ผิดหรือขวาบนเซิร์ฟเวอร์ที่
ทำให้เกิดสิ่งเหล่านี้จะถูกส่งกลับ
ดังนั้นทำไมอาจผลตอบแทนที่เซิร์ฟเวอร์ รหัสสถานะ 200?
คิดใด?
>> ใช่
ดังนั้นสิ่งที่เกี่ยวกับการประสบความสำเร็จ ขอเดินผ่าน
และพวกเขาก็สามารถที่จะกลับมา สิ่งที่คุณถามหา
ดังนั้นทุกอย่างถูกปรับ
สิ่งที่เกี่ยวกับ 302 พบ
ใช่
>> ผู้ชม: เซิร์ฟเวอร์ถูกมอง สำหรับสิ่งที่คุณได้รับการร้องขอ
แต่ก็ไม่สามารถหามัน
ดังนั้นจึงมีข้อผิดพลาด
>> ROB สลิง: ดังนั้นเซิร์ฟเวอร์เป็น มองหาสิ่งที่คุณต้องการ
ดังนั้นเพียงแค่มองหาที่นี่, 302 พบ มันก็สามารถที่จะพบว่ามัน
>> ผู้ชม: ฉันขอโทษ
พบหมายความว่าพวกเขาไม่พบว่ามัน
ขอโทษ
>> ROB สลิง: ดังนั้น 302 พบ
เซิร์ฟเวอร์สามารถที่จะหา สิ่งที่คุณต้องการ
>> ผู้ชม: แต่มันก็ไม่ได้แสดงมันได้หรือไม่
>> ROB สลิง: ความแตกต่างระหว่าง นี้ 302 และ 200 ก็คือว่ามัน
รู้ว่าสิ่งที่คุณต้องการ
แต่มันไม่ได้เป็นว่าที่ คุณอยากจะถาม
ดังนั้น 302 เปลี่ยนเส้นทางปกติ
เพื่อให้คุณได้รับการร้องขอหน้า
มันรู้โอ้ฉันต้องการ ที่จะกลับมาให้คุณนี้
แต่นี้เป็นที่แตกต่างกัน URL
ดังนั้นเดี๋ยวก่อนคุณจริงอยากให้เรื่องนี้
>> DAVID เจลัน: มันเป็นชิ้นส่วนที่กล่าวว่า ที่เราให้พวกคุณเปลี่ยนเส้นทาง
ฟังก์ชั่นที่ใช้ในการทำงานของส่วนหัว ที่ในที่สุดก็จะพิมพ์ออกมาตั้ง
ลำไส้ใหญ่แล้ว URL ที่ คุณต้องการที่จะปฏิเสธผู้ใช้
แม้ว่าคุณจะไม่ได้เห็น 302 มีอย่างชัดเจนว่าเป็นสิ่งที่ PHP
อย่างน่าอัศจรรย์จะแทรกเป็นส่วนหัว บอกว่าสิ่งที่ร็อบกล่าวว่ามี -
พบ
แต่ไปที่นี่แทน
>> ROB สลิง: OK
ดังนั้นสิ่งที่เกี่ยวกับ 403 ที่ต้องห้าม?
>> ผู้ชม: ฉันคิดว่ามันว่าเซิร์ฟเวอร์ เป็นพื้นบอกว่าลูกค้า
ไม่สามารถเข้าถึงหน้าบ้าน
>> ROB สลิง: ดังนั้นใช่
ดีคำตอบที่ปกติเรา คาดหวังว่าเป็นสิ่งที่ต้องการไฟล์
ไม่ chmodded เหมาะสม
นั่นอาจเป็นสิ่งที่อยู่ภายใต้สถานการณ์ คุณเห็นพวกเขา
แต่มีเหตุผลที่ว่าลูกค้า อาจจะเป็นความผิดที่นี่
มีจริงรหัสสถานะอื่น -
401
ดังนั้นเหล่านี้เป็นลักษณะคล้ายกันมาก
>> 401 ไม่ได้รับอนุญาต
และ 403 เป็นที่ต้องห้าม
และไม่ได้รับอนุญาตเพื่อให้คุณเฉพาะ ได้รับถ้าคุณไม่ได้เข้าสู่ระบบค่ะ
แต่การเข้าสู่ระบบอาจหมายถึง ที่คุณมีสิทธิ์
แต่ถ้าคุณกำลังเข้าสู่ระบบอยู่แล้วและคุณ ยังคงไม่ได้รับอนุญาตแล้ว
คุณยังสามารถได้รับการต้องห้าม
ดังนั้นหากคุณกำลังเข้าสู่ระบบและจะได้ไม่ต้อง ได้รับอนุญาตต้องห้ามยังเป็น
สิ่งที่คุณจะได้รับ
>> DAVID เจลัน: และกลไก ซึ่งปัญหาเหล​​่านี้มักจะ
แก้ไขบนเซิร์ฟเวอร์ ผ่านสิ่งที่คำสั่ง
chmod ถ้ามันจริงสิทธิ์ ปัญหาเกี่ยวกับแฟ้มหรือไดเรกทอรี
>> ROB สลิง: 404 แล้วไม่พบ
ใช่
ดังนั้นแตกต่างจากที่ 302 มันก็ไม่ได้ว่า ที่คุณถาม แต่ก็รู้ว่าสิ่งที่
คุณต้องการนี​​้มันก็มี ความคิดสิ่งที่คุณต้องการไม่มี
และคุณไม่ได้ร้องขอ สิ่งที่ถูกต้อง
418 ฉันกาน้ำชาแล้ว 500 เซิร์ฟเวอร์ภายใน
ดังนั้นทำไมคุณอาจได้รับหรือไม่
>> ดังนั้น segfault -
ที่จริงผมไม่ทราบว่าการจัดลำดับ มาตรฐานสำหรับการนี​​้
แต่ถ้าโค้ด PHP ของคุณมีบางสิ่งบางอย่าง ที่ไม่ถูกต้องในนั้นในทางทฤษฎีมันจะ
จริง segfault ในกรณีที่นี้ 500 ข้อผิดพลาดภายในเซิร์ฟเวอร์บางสิ่งบางอย่าง
ผิดกับเซิร์ฟเวอร์ของคุณ องค์ประกอบ
หรือมีข้อผิดพลาดทางไวยากรณ์ ในโค้ด PHP ของคุณ
หรือสิ่งที่ไม่ดีที่เกิดขึ้น
>> DAVID เจลัน: เราไม่เห็น segfault คำตอบในหมู่คนไม่กี่คน
และในทางเทคนิคก็อาจเกิดขึ้นได้
แต่ที่จะเป็น PHP, โปรแกรม เขียนโดยคนอื่นจริง
segfaulted ซึ่งเฉพาะในกรณีที่คนเหล่านั้น เมาขึ้นและเขียนรหัสในรถ
ล่ามของพวกเขาจะ PHP ตัวเอง segfault
ดังนั้นแม้ว่า 500 เป็นเหมือน segfault ในจิตวิญญาณก็เกือบเสมอ
ผลมาจากปัญหาการตั้งค่าไฟล์ กับเว็บเซิร์ฟเวอร์ของคุณหรือเป็นร็อบกล่าวว่า
ไวยากรณ์ผิดพลาดเช่นคุณ ไม่ได้ปิดการเสนอราคา
หรือคุณสูญเสียอัฒภาคอยู่ที่ไหนสักแห่ง
>> ผู้ชม: ดังนั้นสำหรับ pset กระสวยผม คิดว่าเมื่อฉันไม่ได้เมื่อฉันคลิก
เบราว์เซอร์ แต่ไม่มีอะไรขึ้นมา สิ่งที่พวกเขาเรียกว่าหน้าขาว
แต่มันเป็นเพราะของรหัส
ผมคิดว่าเป็น JavaScript ใช่ไหม
>> ROB สลิง: ใช่
>> ผู้ชม: Would ข้อผิดพลาดที่ ยังคงมาได้หรือไม่
>> ROB สลิง: ดังนั้นคุณจะไม่ได้รับ ข้อผิดพลาดนี้เพราะทุกอย่าง
จากมุมมองของเว็บเซิร์ฟเวอร์ ได้ดีอย่างสมบูรณ์
แต่คุณขอ index.html
ที่คุณร้องขอ shuttle.js และ service.js
และมันก็สามารถที่จะประสบความสำเร็จกลับมา ให้คุณทุกสิ่งที่ -
200
ตกลง
ก็ต่อเมื่อเบราว์เซอร์ของคุณพยายามที่จะ ตีความรหัส JavaScript ที่
ก็เหมือนรอนี้ไม่ได้ ข้อผิดพลาดที่ถูกต้อง JavaScript
คำถามใด ๆ อื่น ๆ
ขวาทั้งหมด
>> DAVID เจลัน: ดังนั้นต่อไป ขึ้นเป็นจำนวน 11
11 และเป็นที่น่ากลัวที่สุด สำหรับจำนวนมากของผู้คน
ดังนั้นสิ่งที่สำคัญที่สุดที่จะต้องทราบที่นี่ คือว่าเรื่องนี้เป็นจริงเกี่ยวกับ
รายการที่เชื่อมโยงทวีคูณ
แต่นี้ไม่ได้เช่นเดียวกับปีที่แล้ว ปัญหารายการที่เชื่อมโยงทวีคูณ
ซึ่งไม่ได้ให้คุณคำเตือนว่า รายการได้ในความเป็นจริงเป็นไม่ได้คัดแยก
>> ดังนั้นความจริงที่ว่ารายชื่อที่ถูกคัดเลือก และความจริงที่ว่าคำว่า
ขีดเส้นใต้มีความหมายในการถ่ายทอด ว่านี้เป็นจริงทำให้เข้าใจง่าย
ของสิ่งที่เป็นอย่างอื่นจะได้รับ ปัญหาความท้าทายมากขึ้น
และหนึ่งอีกต่อไป
ดังนั้นข้อผิดพลาดทั่วไปที่นี่ก็จะได้ใส่ การแก้ปัญหาของปีที่แล้วกับคนที่คุณ
วิทยุติดตามตัวและจากนั้นเพียงสุ่มสี่สุ่มห้าคัดลอก ลงเป็นคำตอบที่ถูกต้อง
ตอบคำถามที่แตกต่างกัน ที่คล้ายกันในจิตวิญญาณ
แต่รายละเอียดอื่นที่นี่ สรุปได้ดังนี้
>> ดังนั้นหนึ่งเราได้โหนดและประกาศ ที่กำหนดไว้ในทางปกติท​​ี่นี่
แล้วเรากำหนดไว้เป็นรายชื่อของทั่วโลก ตัวชี้เริ่มต้นเป็นโมฆะ
จากนั้นเห็นได้ชัดว่ามีสองฟังก์ชั่น เรามีต้นแบบที่นี่แทรก
และลบ
และแล้วเราก็มีรหัสตัวอย่างบางส่วนที่นี่ ในการทำพวงของการแทรก
แล้วเราขอให้คุณให้เสร็จสมบูรณ์ การดำเนินการแทรกด้านล่างดังกล่าว
วิธีการที่จะแทรก n ลงในรายการ ในเวลาคงยังขีดเส้นใต้
แม้ว่าในปัจจุบันแล้ว
>> ดังนั้นความงามของความสามารถในการแทรก ในเวลาคงที่ก็คือว่ามันมีความหมาย
ที่คุณต้องใส่ โหนดใหม่ที่ไหน
ลงในหน้า
ดังนั้นจึงช่วยลดความขอบคุณอย่างน้อย หนึ่งในกรณีที่จำเป็นต้องใช้ในการ
สายมากยิ่งขึ้นของรหัสเช่นนั้นได้ ปีที่ผ่านมาและแม้ในชั้นเรียนเมื่อเรา
พูดคุยกันผ่านชนิดของสิ่งนี้ กับมนุษย์และมีบางส่วน
รหัสเทียมวาจา
ดังนั้นในการแก้ปัญหาที่นี่ให้ของข้าม ที่เพียงแค่มีภาพที่
หน้าจอ
>> ขอให้สังเกตว่าเรากำลังทำดังต่อไปนี้
และยังสังเกตเห็นความเรียบง่ายอื่น ๆ ก็คือการที่แม้ว่าจะเป็น
อยู่แล้วดังนั้นนี้หมายความว่าแม้ว่า จำนวนมีอยู่แล้วคุณสามารถ
เพียงสุ่มสี่สุ่มห้าแทรกอีก สำเนาของมัน
และนั่นก็หมายถึงการเป็น ความเรียบง่ายเพื่อให้คุณสามารถ
มุ่งเน้นจริงๆบางมากขึ้น ส่วนที่น่าสนใจและสติปัญญา
ไม่ได้เป็นเพียงบางข้อผิดพลาดการตรวจสอบเพิ่มเติม กำหนดเวลาที่ จำกัด
>> ดังนั้นในการแก้ปัญหาตัวอย่างนี้เราจัดสรร ตัวชี้ที่มือซ้าย
อีกด้านหนึ่งที่นี่เพื่อโหนด
ตอนนี้ตระหนักถึงตัวชี้ว่าเป็น ร็อบกล่าวว่าเป็นเพียง 32 บิต
และมันก็ไม่ได้มีจริง ที่อยู่จนกว่าคุณจะ
กำหนดที่อยู่
และเราจะทำอย่างนั้นอยู่ทางด้านขวามือ ด้านผ่าน malloc
เช่นพลเมืองดีเราตรวจสอบว่า malloc ไม่ได้ในความเป็นจริง null เพื่อให้
เราไม่ได้ตั้งใจสร้าง segfault ที่นี่
และเวลาที่คุณใช้ malloc ในชีวิตของคุณ ควรได้รับการตรวจสอบ null เกรงว่า
คุณมีปัญหาที่ละเอียดอ่อน
>> จากนั้นเราก็เริ่มต้นโมฆะว่า n กำหนดและก่อนหน้านี้และต่อไป
และในกรณีนี้ที่นี่ฉันเริ่มต้นได้ ก่อนหน้านี้เป็นโมฆะเพราะใหม่นี้
โหนดเป็นไปได้ใหม่ จุดเริ่มต้นของรายการของฉัน
ดังนั้นจึงเป็นไปได้ ก่อนที่จะไม่มีอะไร
และผมต้องการที่จะเป็นหลักผนวก รายการที่มีอยู่ไปยังโหนดใหม่โดย
การตั้งค่าต่อไปเท่ากันในรายการตัวเอง
แต่ฉันไม่ได้ทำเพียง แต่
ดังนั้นหากรายชื่อของตัวเองอยู่แล้ว และมีอย่างน้อยหนึ่งโหนด
แล้วในสถานที่ที่ว่านี้คือรายการ ที่นี่และฉันแทรกโหนดใหม่ที่นี่ฉัน
ต้องให้แน่ใจว่าโหนดอดีตของฉัน ชี้ไปข้างหลังไปยังโหนดใหม่ของฉัน
เพราะเป็นอีกครั้ง รายการที่เชื่อมโยงทวีคูณ
>> ดังนั้นเราจึงดำเนินการตรวจสอบสุขภาพจิตดี
ถ้ารายการไม่ได้เป็นโมฆะถ้ามีอยู่แล้ว หนึ่งหรือมากกว่าหนึ่งโหนดมีแล้ว
เพิ่มที่กลับมาอ้างอิงเพื่อที่จะพูด
และแล้วสิ่งสุดท้ายที่เราต้องการ ทำคือการปรับปรุงจริงทั่วโลก
รายการตัวแปรตัวเองไปยังจุดที่ ที่โหนดใหม่
ใช่
>> ผู้ชม: ในตัวชี้ลูกศร [ไม่ได้ยิน] เท่ากับโมฆะไม่ว่า
จัดการกับรายการเพราะ รายการเป็นโมฆะ?
>> DAVID เจลัน: Nope
ที่เป็นเพียงฉันเป็นเชิงรุก ระวังในการที่ว่านี้เป็นของฉัน
รายการเดิมที่มีบางทีบางโหนดเพิ่มเติม กว่าที่นี่และฉันใส่ฉัน
โหนดใหม่กว่าที่นี่มีจะ จะไม่มีอะไรที่นี่
และฉันต้องการที่จะจับความคิดที่ว่า โดยการตั้งค่าก่อนหน้านี้
null ที่โหนดใหม่
และสันนิษฐานว่าถ้ารหัสของฉันถูกต้อง และไม่มีทางอื่นที่จะใส่เป็น
โหนดอื่น ๆ กว่าฟังก์ชั่นนี้ สันนิษฐานว่าแม้ว่ารายชื่อที่มีอยู่แล้ว
หนึ่งหรือมากกว่าหนึ่งโหนดในนั้นสันนิษฐานว่า รายการโหนดแรกจะมี
ตัวชี้ก่อนหน้านี้ของตัวเอง null
>> ผู้ชม: และเพียงแค่ติดตาม
เหตุผลที่คุณย้ายตัวชี้เท่ากับต่อไป รายการที่คุณกำลังทำชี้
ก่อนที่รายการในการที่จะชี้ ต่อไปผมคิดว่า -
ฉันห้าม -
เพียงแค่แสดงรายการ?
>> DAVID เจลัน: แน่นอน
และเพื่อให้เป็นจริงพิจารณาสองกรณี ที่นี่จริงๆแม้ว่า
เพื่อที่เราจะคิดว่าพวกเขาไม่ได้เป็น มากเช่นเดียวกับรหัส
แต่ในระดับสูงถ้านี้แสดงให้เห็นถึง รายการและนี้เป็น 32 บิต
ชี้สถานการณ์ที่ง่ายที่สุดคือ ว่านี้เป็นโมฆะโดยปริยาย
และคิดว่าฉันต้องการแทรก หมายเลข 50 เป็นหมายเลขแรก
ดังนั้นฉันจะไปข้างหน้าและจัดสรร โหนดซึ่งจะประกอบด้วย
สามเขต -
n, ก่อนหน้านี้และต่อไป
>> ฉันจะใส่หมายเลข 50 ที่นี่เพราะนี้จะเป็น n
นี้จะเป็นอย่างไรต่อไป
และจะเป็นหน้าที่
และอื่น ๆ สิ่งที่ฉันจะทำอย่างไรในกรณีนี้
ดีฉันได้ทำเพียงแค่ 1 สายที่นี่
ตัวชี้ n รับ n
แล้วที่ฉันพูดก่อนหน้านี้ ควรจะได้รับโมฆะ
ดังนั้นนี้จะเป็นโมฆะ
แล้วฉันจะกล่าวต่อไป จะได้รับรายชื่อ
>> และนี้ก็ทำงานออกมาได้ดี
นี้เป็นโมฆะ
และอื่น ๆ ที่ฉันพูดโหนดใหม่ต่อไป ควรที่จะได้รับสิ่งนี้
ดังนั้นที่ทำให้ null อื่นมี
และแล้วสิ่งที่ผ่านมา ฉันจะได้รับการตรวจสอบที่นี่
ถ้ารายการไม่เท่ากับโมฆะ แต่มัน เท่ากับโมฆะดังนั้นเราจึงข้าม
โดยสิ้นเชิง
และอื่น ๆ ทั้งหมดที่ฉันทำต่อไปคือรายการที่ได้รับ ตัวชี้ซึ่งจะส่งผลให้วาดรูปใน
ภาพเช่นนั้น
เพื่อให้สถานการณ์อย่างใดอย่างหนึ่ง
>> และคนที่คุณถูกถามเกี่ยวกับ โดยเฉพาะเป็นสถานการณ์เช่นนี้
ที่เรามีอยู่แล้วรายการหนึ่งโหนด
และถ้าเราไปกลับขึ้นไปในต้นฉบับ งบปัญหาต่อไปที่เราจะ
พูดแทรกเป็น 34 เพียงเพื่อ เพราะการสนทนา
ดังนั้นฉันจะเพียงแค่อำนวยความสะดวก วาดว่ากว่าที่นี่
ฉันได้ malloced เพียง
สมมติว่าผมตรวจสอบโมฆะ
>> ตอนนี้ผมกำลังจะเริ่มต้น n จะเป็น 34
และนี้จะเป็น n
นี้จะเป็นอย่างไรต่อไป
และจะเป็นหน้าที่
ขอให้แน่ใจว่าฉันไม่ได้ ได้รับนี้ไปข้างหลัง
แล้วมาก่อน ในความหมาย
ให้ฉันแก้ไขปัญหานี้
นี่คือหน้าที่
ต่อไปนี้เป็น
ถึงแม้ว่าเหล่านี้เป็นเหมือนกัน ขอให้มันสอดคล้อง
>> ก่อน
ต่อไปนี้เป็น
ดังนั้นผมจึงได้ malloced เพียงบันทึกของฉันตรวจสอบ โมฆะได้รับมอบหมายให้เป็น 34 โหนด
ที่ผ่านมาได้รับโมฆะ
เพื่อที่จะให้ผมว่า
ถัดไปจะได้รับรายชื่อ
ดังนั้นรายการนี​​้
ดังนั้นนี้เป็นเหมือนกันตอนนี้เป็นภาพวาดนี้ ลูกศรเพื่อให้พวกเขาชี้ไปที่หนึ่ง
ในเดียวกัน
และแล้วฉันตรวจสอบว่ารายการ ไม่เท่ากับโมฆะ
และยังไม่ได้เวลานี้
แล้วฉันจะทำรายการ ได้รับหน้าที่ตัวชี้
>> ดังนั้นรายการก่อนหน้านี้ได้รับ PTR
ดังนั้นนี้มีผลกระทบของการวาง ลูกศรแบบกราฟิกที่นี่
และที่ได้รับเพียงเล็กน้อย หยักเส้น
และแล้วในที่สุดผมปรับปรุง รายการที่จะชี้ไปที่ตัวชี้
ดังนั้นตอนนี้ชี้ไปที่ผู้ชายคนนี้
และตอนนี้ขอทำอย่างรวดเร็ว การตรวจสอบสุขภาพจิตดี
>> นี่คือรายการที่ซึ่งเป็น ตัวแปรทั่วโลก
โหนดแรกเป็นจริง 34 เพราะ ฉันต่อไปนี้ลูกศรที่
และที่ถูกต้องเพราะผมต้องการที่จะ แทรกที่จุดเริ่มต้นของรายการ
โหนดใหม่ทั้งหมด
สนามต่อไปของเขาทำให้ผมผู้ชายคนนี้
ถ้าผมให้ไปผมตีต่อไปเป็นโมฆะ
จึงไม่มีรายชื่อเพิ่มเติม
ถ้าผมตีก่อนหน้านี้ฉันได้รับ กลับที่ผมคาดว่า
>> ดังนั้นยังคงมีตัวชี้ไม่กี่ เห็นได้ชัดว่าจะจัดการกับ
แต่ความจริงที่คุณบอกให้ทำ ในเวลานี้คงหมายความว่าคุณจะ
มีจำนวน จำกัด ของสิ่งที่ คุณได้รับอนุญาตให้ทำ
และสิ่งที่เป็นจำนวนที่
มันอาจจะเป็นหนึ่งในขั้นตอนที่
มันอาจจะสอง
มันอาจจะมีขั้นตอน 1,000
แต่มันก็แน่นอนซึ่งหมายความว่าคุณไม่สามารถ มีชนิดของการวนลูปใด ๆ ที่เกิดขึ้น
ที่นี่ไม่มีการเรียกซ้ำลูปไม่มี
มันเพิ่งจะเป็นสายตายตัว ของรหัสในขณะที่เรามีในตัวอย่างนี้
>> ดังนั้นปัญหาที่เกิดขึ้นต่อไป 12 ขอให้เรา เสร็จสิ้นการดำเนินการลบ
ด้านล่างในลักษณะที่จะเอา n จากรายการในเวลาเชิงเส้น
เพื่อให้คุณมีน้อยมาก ห้องเลื้อยในขณะนี้
คุณอาจจะสมมติ n ว่าถ้าปัจจุบัน ในรายการจะนำเสนอ
ไม่มีมากกว่าหนึ่งครั้ง
และนั่นก็คือค​​วามหมายที่จะทดสอบตาม ลดความซับซ้อนของสมมติฐานดังนั้น
ว่าถ้าคุณพบว่าจำนวน 50 อยู่ที่ไหนสักแห่ง ในรายการที่คุณทำไม่ได้ยัง
ต้องกังวลเกี่ยวกับการดำเนินการต่อไป ย้ำกำลังมองหาทุกที่เป็นไปได้
สำเนาของ 50 ซึ่งก็จะตกมาอยู่กับ เป็น minutia ในเวลาที่ จำกัด บางอย่าง
>> ดังนั้นด้วยลบหนึ่งนี้เป็นมั่นเหมาะ ท้าทายมากขึ้นและมากขึ้น
รหัสที่จะเขียน
แต่ได้อย่างรวดเร็วก่อนตรงไปตรงมาก็อาจจะ มีลักษณะบางอย่างครอบงำและไม่ชอบ
มีวิธีที่คุณอาจจะมีไม่ได้ ขึ้นมาในแบบทดสอบ
แต่ถ้าเรามุ่งเน้นไปที่แต่ละขั้นตอนที่ หวังว่ามันจะทันที
หยุดคุณว่าแต่ละบุคคลเหล่านี้ ขั้นตอนที่จะทำให้ความรู้สึกที่เห็นได้ชัด
มองย้อนกลับไป
ดังนั้นลองมาดู
>> ดังนั้นก่อนที่เราจะเริ่มต้นตัวชี้ จะแสดงตัวเอง
เพราะฉันต้องการเวลาเชิงเส้นที่หมายถึง ฉันจะมีห่วงบางอย่างที่
และเป็นวิธีการทั่วไปที่จะย้ำกว่า โหนดในโครงสร้างรายการหรือชนิดใด
โครงสร้างซ้ำคือการใช้ ตัวชี้ไปยังด้านหน้าของข้อมูล
โครงสร้างและจากนั้นเพียงแค่เริ่มต้นการปรับปรุง มันและเดินไปทางของคุณ
ผ่านโครงสร้างข้อมูล
ดังนั้นฉันจะทำตรงนั้น
>> ในขณะที่ตัวชี้ตัวแปรชั่วคราวของฉัน ไม่เท่ากับโมฆะขอ
ไปข้างหน้าและตรวจสอบ
ฉันได้รับโชคดี
เป็นเขตที่ n ในโหนดฉันในปัจจุบัน กำลังมองหาที่เท่ากับ
จำนวนฉันกำลังมองหา
และถ้าอย่างนั้นเรามาทำอะไรบางอย่าง
ตอนนี้แจ้งให้ทราบนี้ถ้าเงื่อนไข ล้อมรอบทั้ง
บรรทัดต่อไปนี้ของรหัส
นี่คือสิ่งเดียวที่ฉันดูแลเกี่ยวกับ - การหาตัวเลขที่อยู่ในคำถาม
จึงไม่มีอะไรที่ง่าย สิ่งที่แนวคิดนิด ๆ หน่อย ๆ
>> แต่ตอนนี้ฉันรู้และคุณอาจจะมี เพียง แต่ตระหนักในเรื่องนี้หลังจากที่คิด
มันผ่านบิตมี จริงทั้งสองกรณีที่นี่
หนึ่งคือการที่โหนดที่ จุดเริ่มต้นของรายการซึ่งเป็น
ที่น่ารำคาญเล็ก ๆ น้อย ๆ เพราะนั่นคือ กรณีพิเศษเพราะคุณต้องจัดการ
ด้วยสิ่งนี้ซึ่ง เป็นความผิดปกติเพียง
ทุกคนในรายการ มันเป็นสิ่งเดียวกัน
มีโหนดก่อนหน้านี้และต่อไปเป็น โหนดโหนดก่อนหน้าโหนดถั​​ดไป
แต่ผู้ชายคนนี้เป็นพิเศษเล็ก ๆ น้อย ๆ ถ้าเขาที่จุดเริ่มต้น
>> ดังนั้นถ้าตัวชี้เท่ากับรายการ ตัวเองดังนั้นถ้าฉันที่จุดเริ่มต้นของ
รายการและฉันได้พบ n ฉันต้องการ ที่จะทำสองสิ่ง
หนึ่งผมต้องเปลี่ยนรายการ ชี้ไปที่เขตข้อมูลถัดไป 50
ดังนั้นคิดว่าฉันกำลังพยายาม ในการลบ 34
ดังนั้นผู้ชายคนนี้ที่ได้ไป ไปในเวลาเพียงสักครู่
>> ดังนั้นฉันจะบอกว่ารายการ ได้รับตัวชี้ต่อไป
ดีนี้เป็นตัวชี้
ถัดไปจะชี้ไปที่นี่
ดังนั้นนี้มีการเปลี่ยนแปลงลูกศรขวานี้ ตอนนี้ให้ชี้ไปที่ผู้ชายคนนี้ที่นี่
ตอนนี้จำได้ว่าเรามี ตัวแปรชั่วคราว
ดังนั้นเราจึงยังไม่ได้กำพร้าโหนดใด ๆ เพราะผมยังมีผู้ชายคนนี้ของฉัน
การดำเนินการลบ
ดังนั้นตอนนี้รายการถ้าตัวเองไม่ได้เป็นโมฆะ ฉันต้องการที่จะแก้ไขสิ่งเล็ก ๆ น้อย ๆ
>> ฉันจำเป็นต้องตอนนี้ให้แน่ใจว่าลูกศรนี้ ซึ่งก่อนหน้านี้ชี้
50-34 นี้ได้มีที่จะไปออกไป เพราะถ้าฉันพยายามที่จะกำจัด
ของ 34, 50 มีดีกว่าไม่รักษาใด ๆ ชนิดของการอ้างอิงถึงกลับเป็น
ลูกศรชี้ให้เห็น
ดังนั้นผมเพิ่งได้สายนี้
ดังนั้นแล้วฉันทำ
กรณีที่เป็นจริงง่ายสวย
ตัดออกจากศีรษะของรายการ ค่อนข้างตรงไปตรงมา
>> แต่น่าเสียดายที่มีนี้ บล็อกที่น่ารำคาญอื่น
ดังนั้นตอนนี้ฉันมีที่จะต้องพิจารณากรณีที่ ที่มีบางสิ่งบางอย่างที่อยู่ตรงกลาง
แต่มันก็ไม่น่ากลัวเกินไปยกเว้น สำหรับรูปแบบเช่นนี้
ดังนั้นถ้าผมไม่ได้อยู่ที่จุดเริ่มต้นของ รายการผมบางกลาง
และบรรทัดนี้ที่นี่บอกว่าเริ่มต้นที่ ที่ใดโหนดที่คุณอยู่ที่
ไปที่เขตข้อมูลถัดไปโหนดที่ผ่านมา และชี้ว่าการที่ตัวชี้
>> ลองทำเช่นนี้ให้วาดรูป
ที่ได้รับความซับซ้อน
ดังนั้นถ้าผมมีเขตข้อมูลก่อนหน้านี้ที่นี่ - ให้ทำเช่นนี้ - สาขาต่อไปที่นี่
ฉันจะลดความซับซ้อนของตัวชี้ของฉันมากกว่า กว่าวาดทั้งกลุ่ม
สิ่งที่กลับมาครอบคลุม กันและกัน
และตอนนี้ขอเพียงแค่บอกว่านี่คือ 1, 2, 3 เพื่อประโยชน์ในการอภิปรายแม้
แต่ที่ไม่สอดคล้องกับ ปัญหาในคำถาม
>> ดังนั้นนี่คือรายการที่เชื่อมโยงของฉัน
ฉันพยายามที่จะเอาสองในครั้งนี้ รุ่นเฉพาะของเรื่อง
ดังนั้นผมจึงได้ปรับปรุงตัวชี้ไปยัง จะชี้ไปที่ผู้ชายคนนี้
ดังนั้นนี่คือ PTR
เขาชี้ไปที่นี่
นี้เป็นรายการที่มีอยู่ ทั่วโลกก่อนที่จะเป็น
และเขาก็ชี้ไปที่นี่ไม่ว่าสิ่งที่
และตอนนี้ฉันพยายามที่จะเอาสอง
>> ดังนั้นถ้าตัวชี้เป็นชี้ที่นี่ฉัน จะตามเห็นได้ชัดว่า
ตัวชี้ก่อนหน้านี้ที่ทำให้ฉันที่ 1
แล้วฉันจะบอกว่าต่อไป สนามที่นำฉันไปนี้
กล่องที่นี่จะไป ชี้เท่ากันต่อไป
ดังนั้นถ้าตัวชี้นี้เป็นต่อไป
นั่นหมายความว่าลูกศรนี้ความต้องการ ให้ชี้ไปที่ผู้ชายคนนี้
>> ดังนั้นสิ่งที่บรรทัดของรหัสที่มีเพียงแค่ ทำคือนิด ๆ หน่อย ๆ ของเรื่องนี้
และตอนนี้กำลังมองหาเช่น ขั้นตอนในทิศทางที่ถูกต้อง
เราต้องการที่จะเป็นหลักตัดด้วยขากรรไกร 2 ของกลาง 1 และ 3
ดังนั้นมันทำให้รู้สึกว่าเราต้องการที่จะ เส้นทางนี้ชี้รอบ
ดังนั้นบรรทัดถัดไปนี้จะตรวจสอบว่าตัวชี้ ต่อไปคือไม่เป็นโมฆะมี
แน่นอนคนที่ไปทางขวาของ 2, นั่นหมายความว่าเรายังต้องทำ
บุคคลที่ไม่สำคัญน้อยที่นี่
>> ดังนั้นตอนนี้ผมต้องไปตามตัวชี้นี้ และปรับปรุงตัวชี้ก่อนหน้านี้
คนที่แต่งตัวประหลาดที่จะทำนิด ๆ หน่อย ๆ นี้ ที่นี่แก้ปัญหาจุดที่นี่
และตอนนี้มองเห็นนี้เป็นสิ่งที่ดี
มันยุ่งน​​้อยในการที่มี หนึ่งชี้ไปที่ 2 อีกต่อไป
2 จะชี้ไปทางซ้าย
และ 2 จะชี้ไปทางขวา
แต่เขาสามารถทำสิ่งที่เขาต้องการเพราะ เขากำลังจะได้รับการปลดปล่อย
และมันไม่สำคัญว่าสิ่งที่ ค่าเหล่านั้นอีกต่อไป
>> สิ่งที่สำคัญคือว่าส่วนที่เหลืออีก ผู้ชายจะถูกกำหนดเส้นทางดังกล่าวข้างต้น
และด้านล่างของเขาตอนนี้
และแน่นอนว่าเป็นสิ่งที่เราจะทำต่อไป
เราชี้ฟรีซึ่งหมายความว่าเราบอก ระบบปฏิบัติการที่คุณจะยินดี
การเรียกคืนนี้
แล้วสุดท้ายเรากลับ
อื่นโดยปริยายถ้าเรา ยังไม่ได้ส่งกลับไปยัง
เราได้มีการให้มอง
ดังนั้นตัวชี้เท่ากับตัวชี้ต่อไปเพียงแค่ วิธีการย้ายผู้ชายคนนี้ที่นี่
ย้ายผู้ชายคนนี้ที่นี่
ย้ายผู้ชายคนนี้นี่ถ้าในความเป็นจริง เราไม่พบจำนวน
เรากำลังมองหายัง
>> ตรงไปตรงมาเพื่อให้มันดูสมบูรณ์ ครอบงำผมคิดว่าในตอนแรก
อย่างรวดเร็วโดยเฉพาะอย่างยิ่งถ้าคุณพยายามที่ กับเรื่องนี้ในระหว่างการตอบคำถามแล้วดู
บางอย่างเช่นนี้
และคุณตบตัวเองที่ด้านหลัง
ดีมีวิธีที่ฉันสามารถมีไม่ได้ ขึ้นมาว่าในการตอบคำถาม
แต่ผมจะเถียงคุณสามารถถ้าคุณทำลาย มันลงไปในแต่ละบุคคลเหล่านี้
กรณีและเพียงแค่เดินผ่านมัน ระมัดระวังแม้ว่าเป็นที่ยอมรับภายใต้
สถานการณ์เครียด
>> ขอบคุณภาพที่ทำ ทุกอย่างมีความสุข
คุณสามารถวาดใน จำนวนของรูปแบบใด ๆ
คุณไม่จำเป็นต้องที่จะทำครอบคลุม สิ่งที่นี่
คุณสามารถทำมันด้วยตรง สายเช่นนี้
แต่ส่วนสำคัญของปัญหานี้ใน โดยทั่วไปก็คือการตระหนักว่า
ภาพในท้ายที่สุดแล้วควรมีลักษณะเล็ก ๆ น้อย ๆ บางอย่างเช่นนี้เพราะ
เวลาคงที่ส่อให้เห็นว่าคุณให้ ติดขัดและติดขัดและติดขัด
โหนดใหม่ที่จุดเริ่มต้น ของรายการ
คำถามใด?
น่าจะเป็นที่ท้าทายที่สุดของ แน่นอนคำถามที่เข้ารหัส
>> ผู้ชม: ดังนั้นเป็นรายการที่คล้ายกับ มุ่งหน้าไปในตัวอย่างที่แล้ว
>> DAVID เจลัน: แน่นอนว่า
เพียงแค่ชื่อที่แตกต่างกันสำหรับ ตัวแปรทั่วโลก
ทั่วโลกคืออะไร
>> ROB สลิง: OK
ดังนั้นนี้เป็นหนึ่งในสถานที่ที่คุณ ต้องเขียนวรรค
บางคนเขียนเรียงความ กับคำถามนี้
แต่คุณก็จำเป็นต้องใช้เหล่านี้หกคำ เพื่ออธิบายสิ่งที่เกิดขึ้นเมื่อ
คุณพยายามที่จะติดต่อ facebook.com
ดังนั้นฉันจะพูดคุยผ่านกระบวนการ การใช้คำเหล่านี้
ดังนั้นในเบราว์เซอร์ของเราเราพิมพ์ที่ facebook.com และกด Enter
ดังนั้นเบราว์เซอร์ของเราจะสร้าง HTTP ขอให้มันจะส่ง
ผ่านขั้นตอนบางอย่างที่จะ Facebook สำหรับ Facebook เพื่อตอบสนองต่อเราด้วย
HTML ของหน้าของ
>> ดังนั้นสิ่งที่เป็นกระบวนการโดย ซึ่งคำขอ HTTP
จริงได้รับการ Facebook?
ดังนั้นครั้งแรกที่เราจำเป็นต้องแปล Facebook.com
เพื่อให้เพียงแค่ชื่อ Facebook.com, ที่จริงไม่ขอ HTTP
จำเป็นที่จะต้องไป
ดังนั้นเราจึงจำเป็นที่จะแปล Facebook.com ที่อยู่ IP ที่ไม่ซ้ำกัน
ระบุว่าเครื่องเราจริง ต้องการที่จะส่งคำขอนี้
แล็ปท็อปของคุณมีที่อยู่ IP
สิ่งที่เชื่อมต่อกับอินเทอร์เน็ต มีที่อยู่ IP
>> ดังนั้น DNS ระบบชื่อโดเมนที่เป็น สิ่งที่เกิดขึ้นในการจัดการกับการแปล
จาก facebook.com ไปยังที่อยู่ที่ ที่คุณต้องการจริงที่จะติดต่อ
ดังนั้นเราจึงติดต่อเซิร์ฟเวอร์ DNS และ กล่าวว่าสิ่งที่เป็น facebook.com?
มันบอกว่าโอ้ก็อยู่ IP 190.212 บางสิ่งบางอย่างบางสิ่งบางอย่างบางสิ่งบางอย่าง
ขวาทั้งหมด
ตอนนี้ฉันรู้ว่าเครื่อง ฉันต้องการที่จะติดต่อ
>> ดังนั้นแล้วคุณส่งคำขอของคุณ ไปยังเครื่องที่
ดังนั้นวิธีการที่จะได้รับไปยังเครื่องที่
ดีขอไปจาก เราเตอร์กับเราเตอร์ใหญ่
โปรดจำไว้เช่นในชั้นเรียนที่ เราเห็นจริงเส้นทางที่
แพ็คเก็ตเข้ามาเมื่อเราพยายาม ในการติดต่อสื่อสาร
เราเห็นมันกระโดดข้ามมหาสมุทรแอตแลนติก มหาสมุทรที่หนึ่งจุดหรืออะไรก็ตาม
>> ดังนั้นพอร์ตระยะสุดท้าย
ดังนั้นนี่คือตอนนี้ในคอมพิวเตอร์ของคุณ
คุณสามารถมีหลายสิ่งในปัจจุบัน การติดต่อสื่อสารกับอินเทอร์เน็ต
ดังนั้นผมจึงสามารถใช้การพูด, Skype
ฉันอาจจะมีเว็บเบราว์เซอร์เปิด
ฉันอาจจะมีสิ่งที่ torrenting ไฟล์
ดังนั้นสิ่งเหล่านี้เป็น การติดต่อสื่อสารกับ
อินเทอร์เน็ตในทางใดทางหนึ่ง
>> ดังนั้นเมื่อเครื่องคอมพิวเตอร์ของคุณได้รับข้อมูลบางอย่าง จากอินเทอร์เน็ตวิธีการที่ไม่ได้
รู้ว่าสิ่งที่การประยุกต์ใช้จริง ต้องการข้อมูลหรือไม่
ก็ไม่ทราบว่าวิธีการนี​​้โดยเฉพาะ ข้อมูลมีความหมายสำหรับ
torrenting โปรแกรมเมื่อเทียบกับ ไปยังเว็บเบราว์เซอร์หรือไม่
ดังนั้นนี่คือจุดประสงค์ของพอร์ตที่ ทุกการใช้งานเหล่านี้มี
อ้างพอร์ตในคอมพิวเตอร์ของคุณ
ดังนั้นเว็บเบราว์เซอร์ของคุณบอกว่าเดี๋ยวก่อน ฉันฟังในพอร์ต 1000
และโปรแกรมการ torrenting ของคุณจะพูดว่า ฉันฟังในพอร์ต 3000
และ Skype กล่าวว่าฉันใช้พอร์ต 4000
>> ดังนั้นเมื่อคุณได้รับข้อมูลบางอย่างที่เป็นของ หนึ่งในโปรแกรมเหล่านี้ข้อมูล
มีการทำเครื่องหมายที่มีพอร์ตซึ่งก็จริง ควรจะส่งไปพร้อมกับ
ดังนั้นนี้กล่าวว่าโอ้ฉันเป็น ไปยังพอร์ต 1000
ฉันรู้แล้วฉันจำเป็นต้องส่งต่อนี้ ไปพร้อมกับเว็บเบราเซอร์ของฉัน
ดังนั้นเหตุผลที่มันเป็นเรื่องที่เกี่ยวข้องที่นี่ คือเว็บเซิร์ฟเวอร์ที่มีแนวโน้มที่จะ
ฟังในพอร์ต 80
ดังนั้นเมื่อผมติดต่อ Facebook.com ฉัน การติดต่อสื่อสารกับเครื่องบาง
แต่ฉันต้องการที่จะบอกว่าพอร์ตซึ่งจากการที่ เครื่องฉันต้องการที่จะสื่อสารกับ
และเว็บเซิร์ฟเวอร์มีแนวโน้มที่จะ ฟังในพอร์ต 80
>> หากพวกเขาต้องการที่พวกเขาสามารถตั้งค่า ขึ้นเพื่อจะแสดงเป็นพอร์ต 7000
และจากนั้นในเว็บเบราเซอร์ที่จะทำได้ พิมพ์ด้วยตนเอง Facebook.com: 7000
ส่งคำขอไปยังพอร์ต 7000 ของเว็บเซิร์ฟเวอร์ของ Facebook
>> DAVID เจลัน: และในกรณีนี้แม้ แต่เราไม่ได้ต้องการให้คน
กล่าวถึงนี้ในกรณีนี้สิ่งที่พอร์ต จะขอจริงไปหรือไม่
ลองอีกครั้ง
อย่างแน่นอน
ไม่ได้มองหา แต่ความละเอียดอ่อน ที่มีไม่มีใครที่ผ่านมา
>> ROB สลิง: ดังนั้น HTTPS เนื่องจากเป็น ฟังเฉพาะสำหรับ
การเข้ารหัสจะอยู่ในพอร์ต 4430
>> ผู้ชม: อีเมลและ 25 ใช่มั้ย?
>> DAVID เจลัน: ขาออก อีเมล, 25, ครับ
>> ROB สลิง: ฉันไม่ได้รู้ว่าส่วนใหญ่ของ - ทุกคนที่ต่ำกว่ามีแนวโน้มที่จะ
สงวนไว้สำหรับสิ่งที่
ผมคิดว่าทุกอย่างภายใต้ 1024 ลิขสิทธิ์
>> ผู้ชม: ทำไมคุณถึงบอกว่า 3 เป็นจำนวนที่ไม่ถูกต้อง
>> ROB สลิง: เพราะในที่อยู่ IP มีสี่กลุ่มของตัวเลข
และพวกเขากำลัง 0-255
ดังนั้น 192.168.2.1 เป็นเรื่องธรรมดา ที่อยู่ IP เครือข่ายท้องถิ่น
แจ้งให้ทราบทั้งหมดของผู้ที่มีน้อยกว่า 255
ดังนั้นเมื่อผมเริ่มต้นกับ 300 ที่ ไม่อาจมี
เป็นหนึ่งในตัวเลขที่
>> DAVID ลันเจ: แต่ที่คลิปโง่ จาก - มัน CSI ที่พวกเขามี
ตัวเลขที่มีขนาดใหญ่เกินไป ที่อยู่ IP
>> ROB สลิง: คำถามใด ๆ เกี่ยวกับเรื่องนี้?
อย่างใดอย่างหนึ่งต่อไปการเปลี่ยนแปลงเพื่อให้สมบูรณ์ใน หัวข้อ แต่เรามีนี้อาร์เรย์ PHP เพื่อ
บ้านในรูปสี่เหลี่ยม
และเรามีรายชื่อเรียงลำดับ
และเราต้องการที่จะพิมพ์ออกมาในแต่ละรายการ เพียงแค่มีชื่อบ้าน
ดังนั้นเราจึงมีห่วง foreach
ดังนั้นจำไวยากรณ์คือ foreach อาร์เรย์เป็นรายการในอาร์เรย์
ดังนั้นผ่านการทวนของวงแต่ละ บ้านจะใช้เวลาในการอย่างใดอย่างหนึ่ง
ค่าภายในอาร์เรย์
>> ในวันแรกซ้ำบ้าน จะเป็นคาบ๊อตส์
ที่สองย้ำบ้านจะ เป็นหนังสือบ้านและอื่น ๆ
ดังนั้นสำหรับแต่ละรูปสี่เหลี่ยมเป็นบ้านเรา เพียงแค่จะพิมพ์ -
คุณยังจะได้สะท้อน -
รายการและจากนั้นชื่อของบ้าน และจากนั้นปิดรายการ
วงเล็บปีกกาเป็นตัวเลือกที่นี่
>> แล้วเราก็บอกว่าในคำถาม ตัวเองอย่าลืมปิด
แท็กรายชื่อเรียงลำดับ
ดังนั้นเราจึงจำเป็นที่จะต้องออกจากโหมด PHP เพื่อที่จะทำเช่นนี้
หรือเราอาจจะสะท้อน ปิดแท็กรายการไม่เรียงลำดับ
>> DAVID เจลัน: นอกจากนี้ยังดีที่นี่จะ ได้รับที่จะใช้โรงเรียนเก่า
วงที่มี $ i = 0 0 และใช้ในการนับ คิดออกความยาวของเรย์
ทั้งหมดดีเกินไปเพียง wordier น้อย
>> ผู้ชม: ดังนั้นถ้าคุณกำลังจะ [ไม่ได้ยิน] คุณจะทำ -
ฉันลืมสิ่งที่ห่วง [ไม่ได้ยิน] เป็น
คุณจะ $ รูปสี่เหลี่ยมวงเล็บฉัน?
>> DAVID เจลัน: แน่นอน
ใช่ว่า
>> ROB สลิง: อะไรอีกหรือไม่
>> DAVID เจลัน: ทั้งหมดขวา
การค้าเพลย์ออฟ
ดังนั้นมีอัดแน่นของคำตอบ เป็นไปได้สำหรับแต่ละเหล่านี้
เราถูกจริงๆเพียงแค่มองหา สิ่งที่น่าสนใจสำหรับการกลับหัวกลับหางและ
ข้อเสีย
และจำนวน 16 ถามว่าการตรวจสอบของผู้ใช้ เข้าฝั่งไคลเอ็นต์เช่นเดียวกับจาวาสคริปต์
แทนด้านเซิร์ฟเวอร์เช่นเดียวกับ PHP
ดังนั้นสิ่งที่กลับหัวกลับหางของ ทำฝั่งไคลเอ็นต์?
>> ดีหนึ่งในสิ่งที่เรานำเสนอ ให้คุณลดความล่าช้าเพราะคุณ
จะได้ไม่ต้องรบกวนติดต่อ เซิร์ฟเวอร์ซึ่งอาจใช้เวลาไม่กี่
มิลลิวินาทีหรือแม้แต่สองสามวินาที โดยหลีกเลี่ยงที่และเพียงแค่
การตรวจสอบการเข้าฝั่งไคลเอนต์ของผู้ใช้โดย เรียกตัวจัดการในการส่งและ
เพียงแค่การตรวจสอบพวกเขาชนิด สิ่งที่อยู่ในชื่อ?
? พวกเขาบางชนิด ในสำหรับที่อยู่อีเมล
? พวกเขาเลือกหอพักจาก เมนูแบบเลื่อนลง
>> คุณสามารถให้พวกเขามีความคิดเห็นทันที การใช้คอมพิวเตอร์กิกะเฮิรตซ์
หรือสิ่งที่พวกเขาได้ที่ จริงบนโต๊ะของพวกเขา
จึงเป็นเพียงผู้ใช้ที่ดีกว่า มักจะได้สัมผัสกับ
แต่ข้อเสียของการทำฝั่งไคลเอ็นต์ การตรวจสอบถ้าคุณทำมันโดยไม่ได้
ทำตรวจสอบด้านเซิร์ฟเวอร์ที่ ทุกคนส่วนใหญ่ออกมาจาก CS50 มารู้
ที่คุณก็สามารถส่งข้อมูลใด ๆ ที่คุณต้องการ ไปยังเซิร์ฟเวอร์หลายวิธีใด ๆ
ตรงไปตรงมามากที่สุดในเบราว์เซอร์ใด ๆ ที่คุณสามารถ คลิกรอบในการตั้งค่าและเพียงแค่
ปิด JavaScript ซึ่งจะ, จึงปิดการใช้งานรูปแบบใด ๆ
การตรวจสอบ
>> แต่คุณยังอาจเรียกว่าแม้ฉัน ทำสิ่งที่เป็นความลับบางอย่างในชั้นเรียนโดยใช้
เทลเน็ตและที่จริงแกล้ง เป็นเบราว์เซอร์ที่ได้รับโดยการส่ง
การร้องขอไปยังเซิร์ฟเวอร์
และที่ไม่แน่นอน การใช้งานจาวาสคริปต์ใด ๆ
ที่เพียงฉันพิมพ์คำสั่ง ที่แป้นพิมพ์
ดังนั้นจริงๆโปรแกรมใด ๆ ภายในพอ ความสะดวกสบายกับเว็บและ HTTP
สามารถส่งข้อมูลสิ่งที่เขาหรือเธอต้องการ ไปยังเซิร์ฟเวอร์โดยไม่ต้องตรวจสอบ
และถ้าเซิร์ฟเวอร์ของคุณยังไม่ตรวจสอบ พวกเขาให้ฉันชื่อเป็น
นี้จริงที่อยู่อีเมลที่ถูกต้องทำ พวกเขาเลือกที่หอพักคุณอาจท้าย
ขึ้นใส่ปลอมหรือข้อมูลที่ว่างเปล่าเพียง ลงในฐานข้อมูลของคุณซึ่งอาจจะเป็น
จะไม่เป็นสิ่งที่ดีถ้า คุณสมมติว่ามันอยู่ที่นั่น
>> ดังนั้นนี่คือความเป็นจริงที่น่ารำคาญ
แต่โดยทั่วไปแล้วฝั่งไคลเอ็นต์ การตรวจสอบเป็นอย่างมาก
แต่มันหมายถึงการทำงานมากเป็นสองเท่า
แม้ว่าจะมีการทำที่มีอยู่ต่างๆ ห้องสมุดห้องสมุด JavaScript เพื่อ
เช่นที่ทำให้มากนี้ มากน้อยของอาการปวดหัว
และคุณสามารถนำมาใช้บางส่วนของรหัส ฝั่งเซิร์ฟเวอร์ฝั่งไคลเอ็นต์
แต่ไม่ทราบว่าเป็นปกติ การทำงานเพิ่มเติม
ใช่
>> ผู้ชม: ดังนั้นถ้าเราเพียงแค่ กล่าวว่ามีความปลอดภัยน้อย -
>> DAVID เจลัน: [หัวเราะ]
ฮึ
เหล่านี้มักจะยาก คนที่จะตัดสิน
>> ROB สลิง: นั่นจะ ได้รับการยอมรับ
>> DAVID เจลัน: อะไรนะ?
>> ROB สลิง: ฉันสร้างปัญหานี้
ที่จะได้รับการยอมรับ
>> DAVID เจลัน: ใช่
>> ผู้ชม: เย็น
>> ROB สลิง: แต่เราไม่ยอมรับ สำหรับแรกหนึ่ง -
ดีสิ่งที่เรากำลังมองหา สิ่งที่ต้องการที่คุณจะได้ไม่ต้อง
สื่อสารกับเซิร์ฟเวอร์
เราไม่ได้เพียงแค่ยอมรับได้เร็วขึ้น
>> ผู้ชม: สิ่งที่เกี่ยวกับ ไม่โหลดหน้าเว็บ?
>> ROB สลิง: ใช่
นั่นคือคำตอบที่ยอมรับ
>> DAVID เจลัน: อะไรที่เรารู้สึกว่า มันเป็นโอกาสมากขึ้นกว่าไม่น่าจะ
ที่คุณรู้ว่าสิ่งที่คุณเป็น กล่าวว่าซึ่งเป็นเรื่องที่ยาก
สายการวาดบางครั้ง
ใช้รายการการเชื่อมโยงแทน ของอาร์เรย์ที่จะรักษา
รายการที่เรียงลำดับของจำนวนเต็ม
ดังนั้นส่วนต่างจากที่เรามักจะอ้างกับการเชื่อมโยง รายการที่มีแรงบันดาลใจของพวกเขาทั้ง
แนะนำคือการที่คุณได้รับชีวิตชีวา
พวกเขาสามารถเติบโต
พวกเขาสามารถหด
ดังนั้นคุณจึงไม่ต้องกระโดดผ่านห่วง จริงสร้างหน่วยความจำเพิ่มเติม
กับอาร์เรย์
หรือคุณไม่ได้มีเพียงแค่ กล่าวขอโทษผู้ใช้
อาร์เรย์ถูกเติมเต็ม
ดังนั้นการเจริญเติบโตแบบไดนามิกของรายการ
ข้อเสีย แต่ของรายการที่เชื่อมโยง?
>> ผู้ชม: มันเป็นเชิงเส้น
ค้นหาในรายการที่เชื่อมโยงเป็นเส้นตรง แทนสิ่งที่คุณเข้าสู่ระบบ
>> DAVID เจลัน: แน่นอน
ค้นหาในรายการที่เชื่อมโยงเป็นเชิงเส้น แม้จะเรียงลำดับเพราะคุณสามารถ
เพียงปฏิบัติตามขนมปังเหล่านี้เหล่านี้ ชี้จากจุดเริ่มต้นของรายการ
สิ้นสุด
คุณไม่สามารถใช้ประโยชน์จากการเข้าถึงแบบสุ่มและ จึงค้นหาแบบไบนารีถึงแม้ว่ามันจะเป็น
เรียงลำดับที่คุณสามารถทำได้ ทำอย่างไรกับอาร์เรย์
และนอกจากนี้ยังมีค่าใช้จ่ายอื่น
ใช่
>> ผู้ชม: หน่วยความจำไม่มีประสิทธิภาพ
>> DAVID เจลัน: ใช่
ดีฉันจะไม่จำเป็นต้อง กล่าวว่าไม่มีประสิทธิภาพ
แต่มันก็ไม่เสียค่าใช้จ่ายหน่วยความจำมากขึ้น เพราะคุณต้อง 32 บิตสำหรับทุก
โหนดเพื่อชี้เพิ่มเติมที่ อย่างน้อยสำหรับรายการที่เชื่อมโยงโดยลำพัง
ตอนนี้ถ้าคุณเพียงการจัดเก็บจำนวนเต็มและ คุณกำลังเพิ่มตัวชี้ว่า
จริงชนิดที่ไม่น่ารำคาญ
มันเป็นสองเท่าของจำนวนหน่วยความจำ
แต่ในความเป็นจริงถ้าคุณเก็บ รายการที่เชื่อมโยงของ structs ที่อาจมี
8 ไบต​​์ 16 ไบต์มากยิ่งขึ้น กว่าที่บางทีมันอาจจะน้อย
ของต้นทุน
แต่มันเป็นค่าใช้จ่ายกระนั้น
ดังนั้นทั้งของผู้ที่จะได้ รับการปรับเป็นข้อเสีย
>> 18
การใช้ PHP แทน C ที่จะเขียน โปรแกรมบรรทัดคำสั่ง
ดังนั้นที่นี่ก็มักจะเร็วกว่าการใช้ ภาษาเช่น PHP หรือทับทิมหรืองูใหญ่
คุณเพียงแค่ได้อย่างรวดเร็วเปิด ขึ้นโปรแกรมแก้ไขข้อความ
คุณมีฟังก์ชั่นอื่น ๆ อีกมากมาย มีให้คุณ
PHP มีอ่างครัวของฟังก์ชั่น ในขณะที่ใน C คุณ
มีมากน้อยมาก
ในความเป็นจริงคนที่รู้วิธีที่ยาก ว่าคุณไม่ได้มีตารางแฮช
คุณไม่ได้มีการเชื่อมโยงรายชื่อ
ถ้าคุณต้องการที่คุณต้อง ใช้พวกเขาด้วยตัวคุณเอง
>> ดังนั้นหนึ่งกลับหัวกลับหางของ PHP หรือจริงๆใด ๆ แปลภาษาเป็นความรวดเร็ว
ที่คุณสามารถเขียนโค้ด
แต่ข้อเสียที่เราเห็นนี้เมื่อฉัน วิปปิ้งได้อย่างรวดเร็วขึ้น misspeller
การดำเนินการในการบรรยายโดยใช้ PHP เป็น ว่าการใช้ภาษาตีความ
มักจะช้าลง
และเราเห็นว่า demonstrably ด้วย เพิ่มขึ้นในเวลา 0.3 วินาทีถึง 3
วินาทีเพราะของการตีความ ที่เกิดขึ้นจริง
>> คว่ำอีกอย่างคือการที่คุณ ไม่ได้มีการรวบรวม
ดังนั้นจึงยังเพิ่มความเร็วในการพัฒนา บังเอิญเพราะคุณจะได้ไม่ต้อง
ขั้นตอนที่สองในการเรียกใช้โปรแกรม
คุณเพียงแค่ต้องหนึ่ง
และอื่น ๆ ที่สวย ที่น่าสนใจเช่นกัน
โดยใช้ฐานข้อมูล SQL แทน ไฟล์ในการจัดเก็บข้อมูล
ดังนั้นฐานข้อมูล SQL ที่ใช้สำหรับ pset7
CSV ไฟล์ที่คุณไม่ได้ใช้มาก
แต่คุณใช้มันในทางอ้อม pset7 เป็น อย่างดีจากการพูดคุยกับการเงิน Yahoo
>> แต่ CSV เป็นเช่นเดียวกับแฟ้ม Excel แต่ ง่ายสุดที่เป็นคอลัมน์
เพียง demarked ด้วยเครื่องหมายจุลภาคภายใน ของแฟ้มข้อความอย่างอื่น
และการใช้ฐานข้อมูลเป็น เล็ก ๆ น้อย ๆ ที่น่าสนใจมากขึ้น
มันกลับหัวกลับหางเพราะคุณได้รับสิ่งที่ เช่นเลือกและแทรกและลบ
และคุณจะได้รับสมมุติว่าดัชนี MySQL และฐานข้อมูลอื่น ๆ เช่น
Oracle, สร้างสำหรับคุณในหน่วยความจำที่ หมายถึงการเลือกของคุณอาจจะไม่ได้
จะเป็นเส้นด้านบนลงล่าง
ที่จริงมันจะเป็นสิ่งที่ เช่นค้นหา binary หรือสิ่งที่
ที่คล้ายกันในจิตวิญญาณ
ดังนั้นพวกเขากำลังโดยทั่วไปได้เร็วขึ้น
>> แต่ข้อเสียก็คือ เป็นเพียงการทำงานมากขึ้น
มันเป็นความพยายามมากขึ้น
คุณต้องเข้าใจฐานข้อมูล
คุณจะต้องตั้งขึ้น
คุณต้องการที่จะเรียกใช้เซิร์ฟเวอร์ ที่ฐานข้อมูลบน
คุณต้องเข้าใจ วิธีการกำหนดค่า
ดังนั้นเหล่านี้เป็นเพียงเหล่านี้ ชนิดของการค้าเพลย์ออฟ
ในขณะที่ไฟล์ที่คุณสามารถ สร้างมันขึ้นมาด้วย Gedit
และคุณจะดีไป
มีความซับซ้อนกว่านั้นไม่ได้
>> Trie ที่ใช้แทนของตารางแฮช ด้วยการผูกมัดที่แยกต่างหากในการจัดเก็บ
พจนานุกรมของคำที่ชวนให้นึกถึง ของ pset5
ดังนั้นพยายามที่กลับหัวกลับหางในทางทฤษฎี อย่างน้อยคืออะไร
เวลาคงที่อย่างน้อยถ้าคุณ hashing ในแต่ละบุคคล
ตัวอักษรในคำเช่นคุณ อาจจะมีสำหรับ pset5
ที่อาจจะมีห้า hashes หก hashes ถ้ามีห้าหรือหก
ตัวอักษรในคำว่า
และนั่นคือสิ่งที่ดีงาม
และถ้ามีขีด จำกัด ในการ ยาวคำพูดของคุณอาจจะมีที่
เวลาแน่นอนคง asymptotically
>> ในขณะที่ตารางแฮชที่มีการแยก ผูกมัดปัญหาอยู่กับที่
ชนิดของโครงสร้างข้อมูลที่ ประสิทธิภาพการทำงานของขั้นตอนวิธีการของคุณมักจะ
ขึ้นอยู่กับจำนวนของสิ่ง แล้วในโครงสร้างข้อมูล
และที่แน่นอนกรณีที่มี โซ่ด้วยเหตุนี้สิ่งที่เพิ่มเติมที่คุณใส่
ลงในตารางแฮชอีกต่อไปที่ โซ่ไปซึ่งหมายความว่าในที่เลวร้ายที่สุด
กรณีที่สิ่งที่คุณอาจจะมองหา เป็นวิธีการที่ส่วนท้ายของหนึ่ง
ของเครือข่ายเหล่านั้นซึ่งได้อย่างมีประสิทธิภาพ devolves เป็นสิ่งที่เป็นเส้นตรง
>> ขณะนี้ในทางปฏิบัติมันจะทำได้อย่างแน่นอน เป็นกรณีที่ตารางแฮชกับ
โซ่จะเร็วกว่าการที่สอดคล้องกัน การดำเนิน Trie ที่
แต่นั่นด้วยเหตุผลต่างๆในหมู่ ซึ่งจะพยายามใช้จำนวนมากทั้งจาก
หน่วยความจำที่สามารถในความเป็นจริงสิ่งที่ช้า ลงเพราะคุณไม่ได้รับที่ดี
ประโยชน์ของสิ่งที่เรียกว่าแคช ที่สิ่งที่อยู่ใกล้กัน
ในหน่วยความจำที่สามารถเข้าถึงได้ มักจะได้อย่างรวดเร็วมากขึ้น
และบางครั้งคุณสามารถเกิดขึ้นกับ ฟังก์ชันแฮชที่ดีจริงๆ
แม้ว่าคุณจะต้องเสียบิตของ หน่วยความจำที่คุณอาจจริงจะสามารถ
ค้นหาสิ่งที่รวดเร็วและไม่ ที่เลวร้ายที่สุดเท่าที่จะเป็นเส้นตรง
>> ดังนั้นในระยะสั้นมีไม่จำเป็นต้อง กับใด ๆ ของเหล่านี้อย่างใดอย่างหนึ่งหรือแม้กระทั่งสอง
สิ่งที่เฉพาะเจาะจงที่เรากำลังมองหา
อะไรจริงๆโน้มน้าวใจ ที่กลับหัวกลับหางและข้อเสีย
จับทั่วไปตาของเรา
>> ROB สลิง: ดังนั้นสำหรับกลับหัวกลับหางที่เราทำ ไม่ยอมรับในตัวเอง "เร็วขึ้น". คุณ
มีการพูดอะไรบางอย่างเกี่ยวกับเรื่องนี้
แม้ว่าคุณจะกล่าวว่าทฤษฎีได้เร็วขึ้น เรารู้ว่าคุณเข้าใจชนิดของ
ว่ามันเป็น 0 จาก 1
และตารางแฮชในทางทฤษฎี ไม่ 0 จาก 1
กล่าวถึงอะไรเกี่ยวกับรันไทม์ โดยทั่วไปมีคุณจุด
แต่ "เร็ว" ที่สุดของการแก้ปัญหาใน กระดานขนาดใหญ่ที่ได้รับการพยายามเป็น
วัตถุช้ากว่าการแก้ปัญหา ที่มีตารางแฮช
ดังนั้นเร็วขึ้นในตัวของมันเอง ไม่เป็นความจริงจริงๆ
>> DAVID เจลัน: Dom เดอุดมอุดม
ฉันอาจจะเป็นคนเดียวที่รู้ ว่าเป็นวิธีที่ควรจะ
ได้รับการประกาศใช่ไหม
>> ROB สลิง: ผมมีความคิดที่ไม่มีจริง
>> DAVID เจลัน: มันทำ ความรู้สึกในหัวของฉัน
>> ROB สลิง: ฉันทำอย่างใดอย่างหนึ่งนี้
ตกลง
ดังนั้นนี้เป็นหนึ่งในสถานที่ที่คุณมีการวาด แผนภาพคล้ายกับคุณอาจ
ได้เห็นในการสอบที่ผ่านมา
เพื่อให้เพียงดูที่นี้
ดังนั้นจากโหนด HTML, เรามีสอง เด็กหัวและลำตัว
ดังนั้นเราจึงสาขา - หัวและลำตัว
ศีรษะมีแท็กชื่อ
ดังนั้นเราจึงมีชื่อ
>> ตอนนี้สิ่งหนึ่งที่ผู้คนจำนวนมาก ลืมคือโหนดข้อความเหล่านี้
องค์ประกอบภายในต้นไม้ต้นนี้
ดังนั้นที่นี่เราเกิดขึ้นที่จะดึงพวกเขาเป็นวงรี ความแตกต่างของพวกเขาจากเหล่านี้
ชนิดของโหนด
แต่ยังแจ้งให้ทราบที่นี่เรามีด้านบน กลางและล่างจะจบลงด้วยการ
โหนดข้อความ
ดังนั้นลืมที่ค่อนข้าง ของข้อผิดพลาดทั่วไป
>> ร่างกายมีลูกสามคน - ทั้งสาม divs
ดังนั้น div, div div แล้วข้อความ เด็กโหนดของ divs ที่
ที่มันสวยมาก คำถามที่
>> DAVID เจลัน: และก็คุ้มค่าสังเกต แม้ว่าเราจะไม่ได้อาศัยอยู่ในเหล่านี้
รายละเอียดในเวลาที่เราใช้จ่ายในการ JavaScript, ว่าคำสั่งไม่ใน
ความเป็นจริงไม่ว่าในทางเทคนิค
ดังนั้นถ้าหัวมาก่อนที่ร่างใน HTML แล้วมันจะปรากฏ
ด้านซ้ายของร่างกายใน DOM ที่เกิดขึ้นจริง
ว่าเขาคือโดยทั่วไปเพียง FYI, สิ่งที่เรียกว่าการสั่งซื้อเอกสารที่
มันไม่สำคัญ
และถ้าคุณได้รับการดำเนินการแยกวิเคราะห์, โปรแกรมที่อ่าน HTML ในอาคาร
ขึ้นต้นไม้ในหน่วยความจำที่จะซื่อสัตย์ สังหรณ์ใจว่าอาจเป็นสิ่งที่คุณ
ทำต่อไป - บนลงล่าง จากซ้ายไปขวา
>> ROB สลิง: คำถามเกี่ยวกับการที่
ฉันควรทำอย่างใดอย่างหนึ่งต่อไปหรือไม่
>> DAVID เจลัน: แน่นอน
>> ROB สลิง: OK
ดังนั้นนี่คือบัฟเฟอร์บุกรุก คำถามโจมตี
สิ่งสำคัญที่ต้องจำที่นี่คือ ดีว่าอาจจะเคล็ดลับศัตรู
โปรแกรมนี้ในการดำเนินงาน โค้ด?
ดังนั้น argv1 บรรทัดคำสั่งแรก อาร์กิวเมนต์โปรแกรมนี้ที่สามารถเป็น
ยาวโดยพล
แต่ที่นี่เรากำลังใช้ memcpy การคัดลอก argv1 ซึ่งที่นี่เป็นแถบ
เราผ่านมันเป็นอาร์กิวเมนต์
และดังนั้นจึงสละบนแถบชื่อ
>> ดังนั้นเรา memcpying บาร์ ลงในบัฟเฟอร์นี้ค
เรามีวิธีการมากมายที่คัดลอกไบต์?
ดีไบต์บาร์จำนวนมาก แต่ที่เกิดขึ้นกับ จะใช้ความยาวของการโต้แย้งว่า
แต่คเป็นเพียง 12 ไบต์กว้าง
ดังนั้นหากเราพิมพ์อาร์กิวเมนต์บรรทัดคำสั่ง ที่ยาวกว่า 12 ไบต์เรา
จะล้นนี้ บัฟเฟอร์โดยเฉพาะอย่างยิ่ง
ตอนนี้วิธีที่อาจศัตรูหลอกลวง โปรแกรมในการรันโค้ดโดยพล?
>> ดังนั้นจำไว้ว่าที่นี่ หลักจะเรียก foo
และอื่น ๆ แล้วหลักเรียก foo
ลองวาดนี้
ดังนั้นเราจึงมีสแต็คของเรา
และหลักมีกรอบสแต็ค ที่ด้านล่าง
ในบางจุดหลักเรียก foo
ดีทันทีสายหลัก foo
และเพื่อให้ได้รับ foo กรอบสแต็คของตัวเอง
>> ตอนนี้ในบางจุด foo จะกลับมา
และเดินกลับ foo เราจำเป็นต้องรู้ที่ สิ่งที่บรรทัดของรหัสภายในของเราเป็นหลัก
อยู่ในลำดับที่จะทราบว่า เราควรจะกลับมาทำงานในหลัก
เราสามารถเรียก foo จากทั้งหมด พวงของสถ​​านที่ที่แตกต่างกัน
เราจะรู้ได้อย่างไรว่าจะกลับมา?
ดีเราจำเป็นต้องเก็บบางที่
>> ดังนั้นที่ถูกต้องรอบที่นี่เราเก็บ ที่เราควรจะกลับไปอีกครั้ง
ผลตอบแทน foo
และนี่คือที่อยู่ผู้ส่ง
ดังนั้นวิธีการที่ฝ่ายตรงข้ามอาจจะใช้ประโยชน์ นี้เป็นความจริงที่ว่า
บัฟเฟอร์นี้คจะถูกเก็บไว้ให้ บอกว่าที่นี่เป็นค
ดังนั้นเราจึงได้มี 12 ไบต์สำหรับค
นี้เป็นค
และนี่คือกองแหวน foo ของ
ดังนั้นหากผู้ใช้ที่เป็นอันตรายเข้ามามากขึ้น กว่า 12 ไบต์หรือพวกเขาป้อนคำสั่ง
อาร์กิวเมนต์บรรทัดที่นานกว่า 12 ตัวละครแล้วเรากำลังจะ
หน่วยความจำล้นนี้
>> เราสามารถเก็บไป
และในบางจุดที่เราจะไปไกล พอที่จะทำให้เราเริ่มต้น
เขียนทับอยู่กลับนี้
ดังนั้นเมื่อเราเขียนทับอยู่กลับมา นี้หมายความว่าเมื่อ foo
ผลตอบแทนที่เรากำลังจะกลับไปที่ใดก็ตาม ใช้ที่เป็นอันตรายจะบอกให้โดย
สิ่งที่ค่ามันเข้ามาโดยสิ่งที่ ตัวละครที่ผู้ใช้ป้อน
ดังนั้นหากผู้ใช้ที่เป็นอันตรายจะถูก ฉลาดโดยเฉพาะอย่างยิ่งเขาสามารถมีนี้
กลับไปที่ไหนสักแห่งใน printDef ฟังก์ชั่นหรือที่ไหนสักแห่งใน malloc
ฟังก์ชั่นโดยพลการเพียงใดก็ได้
>> แต่ถึงแม้จะฉลาดมากขึ้นเป็นสิ่งที่ถ้าเขามี ผู้ใช้กลับไปที่นี่
และจากนั้นคุณเริ่มดำเนินการ เหล่านี้เป็นสายของรหัส
ดังนั้นที่จุดที่ผู้ใช้สามารถป้อน สิ่งที่เขาต้องการเข้ามาในภูมิภาคนี้
และเขามีการควบคุมที่สมบูรณ์ กว่าโปรแกรมของคุณ
คำถามที่
ดังนั้นคำถามต่อไปคือที่สมบูรณ์ เท่าไรของ foo ในลักษณะ
ว่ามันเป็นความเสี่ยงที่ไม่จำเป็น
>> ดังนั้นจึงมีสองวิธี คุณจะได้ทำนี้
เรายังมีคเพียง เป็นความยาว 12
คุณอาจจะมีการเปลี่ยนแปลงนี้ เป็นส่วนหนึ่งของการแก้ปัญหาของคุณ
นอกจากนี้เรายังเพิ่มการตรวจสอบที่จะทำให้ แน่ใจว่าบาร์ก็ไม่เป็นโมฆะ
แม้ว่าคุณจะไม่จำเป็นต้อง ว่าสำหรับเครดิตเต็ม
ดังนั้นเรากำลังตรวจสอบครั้งแรก ความยาวสตริงของแถบ
ถ้ามันมากขึ้นกว่า 12 แล้ว ไม่จริงทำสำเนา
เพื่อให้เป็นวิธีหนึ่งในการแก้ไขมัน
>> วิธีการแก้ไขมันก็คือแทน มีคเพียง แต่จะมีความยาว 12, มีมัน
จะมีระยะเวลาใน strlen (บาร์)
วิธีการแก้ไขมันก็คือ ที่จริงเพิ่งกลับ
ดังนั้นถ้าคุณมีอากาศเพียงกำจัดทั้งหมดของ นี้ถ้าคุณได้เพียงแค่ลบออกทั้งหมด
บรรทัดของรหัสที่คุณจะได้รับ เครดิตเต็มรูปแบบตั้งแต่ฟังก์ชั่นนี้
ไม่จริงสำเร็จอะไร
มันคัดลอกบรรทัดคำสั่ง อาร์กิวเมนต์เป็น array ในบาง
กรอบสแต็คของท้องถิ่น
และแล้วสิ่งที่จะกลับมา
และประสบความสำเร็จในสิ่งที่มันจะหายไป
ดังนั้นการกลับมาก็เพียงพอ วิธีการรับเครดิตเต็ม
>> DAVID เจลัน: ไม่เชิงจิตวิญญาณของ คำถาม แต่ยอมรับต่อ
spec กระนั้น
>> ROB สลิง: คำถามใด ๆ ของที่
สิ่งหนึ่งที่คุณอย่างน้อย จำเป็นต้องมีการรวบรวมรหัส
ดังนั้นแม้ว่าในทางเทคนิคคุณไม่ได้ เสี่ยงถ้ารหัสของคุณไม่ได้
รวบรวมเราไม่ได้ยอมรับว่า
ไม่มีคำถาม
ตกลง
>> DAVID เจลัน: คุณต้องการ ที่จะบอกว่าชื่อนี้
>> ROB สลิง: เลขที่
>> DAVID เจลัน: ดังนั้นในหนึ่งนี้นี้ เป็นทั้งข่าวดีหรือข่าวร้าย
นี้เป็นอย่างแท้จริงปัญหาเดียวกัน เป็นคำถามแรก
และก็เกือบจะเหมือนกัน ปัญหาเป็น pset1
แต่มันก็ง่ายจงใจจะ ปิรามิดที่เรียบง่ายอย่างใดอย่างหนึ่งที่สามารถ
แก้ไขได้ด้วยเล็กน้อย ย้ำง่าย
และจริงๆสิ่งที่เราได้รับที่ ที่นี่เป็นไม่มากตรรกะ
เพราะอาจจะโดยจุดนี้คุณ สะดวกสบายมากขึ้นกว่าที่คุณมี
ในหนึ่งสัปดาห์ด้วยการลูปหรือทำไมลูป แต่จริงๆการหยอกล้อกันว่า
คุณน้อยความสะดวกสบายด้วย ความคิดที่ว่า PHP ไม่ได้เป็นเพียงเกี่ยวกับสิ่งที่
การเขียนโปรแกรม
มันสามารถจริงจะใช้เป็นภาษา การเขียนโปรแกรมบรรทัดคำสั่ง
>> และแน่นอนว่าเป็นสิ่งที่เรากำลังพยายาม เพื่อดึงดูดความสนใจของคุณไปยัง
นี้เป็นโปรแกรมบรรทัดคำสั่ง PHP
ดังนั้นรหัส C ที่นี่ในขณะที่ถูกต้อง ใน C ไม่ถูกต้องสำหรับ PHP
แต่รหัสจริงๆเหมือนกัน
ถ้าคุณเปรียบเทียบโซลูชั่นสำหรับการทดสอบ 0 กับแบบทดสอบ 1, คุณจะพบว่า
ก็เหมือนกันเกือบยกเว้น บางสัญญาณดอลลาร์และ
ไม่มีชนิดข้อมูล
โดยเฉพาะอย่างยิ่งถ้าเราใช้เวลาดูที่นี่ คุณจะเห็นว่าเราย้ำในการนี​​้
กรณีที่ 1 ขึ้นถึง 7
>> เราจะได้ทำมัน 0 ดัชนี
แต่บางครั้งผมคิดว่ามันเป็นเพียง จิตใจง่ายที่จะคิดเกี่ยวกับสิ่งที่
1-7
ถ้าคุณต้องการบล็อกหนึ่งแล้วสอง บล็อกแล้วสามแล้ว
จุดจุดจุดเจ็ด
เราได้เจถูกเริ่มต้นได้ที่ 1 แล้วนับถึงฉัน
และทุกอย่างที่นี่เป็น อย่างอื่นเหมือนกัน
แต่ค่าของโน้ตเป็น สองสิ่ง
เราให้คุณทั้งสองสายเป็นครั้งแรกนี้ หนึ่งชื่อ goofily เป็น shebang
เพื่อปังคม
และที่เพียงแค่ระบุเส้นทาง โฟลเดอร์ที่โปรแกรมสามารถ
พบว่าคุณต้องการใช้ การตีความแฟ้มนี้
>> แล้วสายหลังจากนั้นของ แน่นอนหมายถึงการเข้าสู่โหมด PHP
และสายที่ด้านล่างสุด หมายถึงการออกจากโหมด PHP
และงานนี้โดยทั่วไปด้วย แปลภาษา
มันเป็นชนิดที่น่ารำคาญถ้าคุณเขียน โปรแกรมในไฟล์ที่เรียกว่า foo.php
และจากนั้นผู้ใช้ของคุณมีเพียงแค่ จำได้ตกลงที่จะใช้โปรแกรมนี้ผม
ต้องพิมพ์ "foo.php พื้นที่ PHP." ชนิด ที่น่ารำคาญถ้าไม่มีอะไรอื่น
และยังแสดงให้เห็นว่าโปรแกรมของคุณ เขียนใน PHP ซึ่งเป็นไม่ได้ทั้งหมด
ที่ให้แสงสว่างสำหรับผู้ใช้
>> เพื่อให้คุณสามารถลบ PHP. ทั้งหมด จำจากการบรรยาย
และคุณสามารถทำได้จริง. / foo ถ้า คุณได้ chmodded มันด้วยการทำให้
ปฏิบัติการ
ดังนั้น chmod + x foo จะทำที่
และถ้าคุณยังเพิ่ม shebang ที่นี่
แต่จริงๆปัญหาที่ได้รับ พิมพ์ออกบางอย่างเช่นนี้
ไม่ใช้ HTML ไม่รหัส C-แน่นอน PHP เพียงบางส่วน
ดังนั้นไมโลแล้วกลับมาในปัญหา 25
และใน 25 คุณจะได้รับต่อไปนี้ รหัสโครงกระดูกซึ่งเป็น
หน้าเว็บง่ายสวย
และเป็นส่วนหนึ่งฉ่ำ HTML ฉลาดลดลง ที่นี่ที่เรามีอยู่ภายในของร่างกาย
รูปแบบที่มีรหัสเฉพาะของปัจจัยการผลิต ภายในซึ่งเป็นสองปัจจัยการผลิตอย่างใดอย่างหนึ่ง
กับความคิดของชื่อหนึ่ง กับความคิดของปุ่ม
>> อันแรกก็คือประเภทข้อความ ประเภทที่สองของการส่ง
และเพื่อให้เราให้คุณเป็นจริงมากขึ้น ส่วนผสมกว่าที่คุณจำเป็นต้องใช้เพียงเพื่อให้
พวกคุณมีตัวเลือกที่ การแก้ปัญหานี้
คุณไม่จำเป็นต้องใช้อย่างเคร่งครัด ทั้งหมดของรหัสเหล่านี้
แต่มันช่วยให้คุณสามารถที่จะแก้ปัญหา มันในรูปแบบที่แตกต่างกัน
และขึ้นที่ด้านบนสังเกตว่า วัตถุประสงค์คือการเรียก
หน้าต่างเช่นนี้ -
สวัสดีไมโล! -
จะปรากฏขึ้นในเบราว์เซอร์ที่ใช้ ง่ายสุดถ้า
ไม่น่าเกลียดฟังก์ชั่นการแจ้งเตือน
ดังนั้นในท้ายที่สุดนี้เดือดลง แนวคิดอย่างใดฟัง
ส่งในรูปแบบที่ฝั่งไคลเอ็นต์ ไม่ด้านเซิร์ฟเวอร์อย่างใด
การตอบสนองต่อการส่งว่า โลภค่าที่ผู้ใช้พิมพ์
ในฟิลด์ชื่อแล้ว การแสดงมันในร่างกายของการแจ้งเตือน
>> ดังนั้นวิธีหนึ่งที่คุณสามารถทำเช่นนี้กับ jQuery ซึ่งมีลักษณะเล็ก ๆ น้อย ๆ
syntactically งงในตอนแรก
คุณสามารถทำเช่นนี้กับรหัส DOM บริสุทธิ์ - document.getelement ตามหมายเลข
แต่ขอให้ดูที่รุ่นนี้
ฉันมีสองสิ่งที่สำคัญ บรรทัดแรก
ดังนั้นหนึ่งเรามีเส้นนี้ซึ่งเป็น เหมือนกันกับสิ่งที่คุณอาจได้เห็น
ในผมเชื่อว่า form2.html จากการเรียนในสัปดาห์ที่ 9
และนี่เป็นเพียงการบอกว่าการดำเนินการ รหัสต่อไปนี้เมื่อ
เอกสารพร้อม
นี้มีความสำคัญเพียงเพราะ หน้า HTML จะอ่านบน
ด้านล่างจากซ้ายไปขวา
>> และดังนั้นถ้าคุณพยายามที่จะทำ บางสิ่งบางอย่างในรหัสขึ้นที่นี่เพื่อ DOM บาง
องค์ประกอบแท็กบางอย่างที่ว่าลง ที่นี่คุณกำลังทำมันเร็วเกินไป
เพราะมีไม่ได้ ถูกอ่านในหน่วยความจำ
ดังนั้นด้วยการพูดว่า document.ready นี้ สายที่เรากำลังจะบอกว่า
นี่คือรหัสบางเบราว์เซอร์
แต่ไม่ดำเนินการนี​​้จนกว่าทั้ง พร้อมเอกสารที่เป็น DOM
ต้นไม้ที่มีอยู่ในหน่วยความจำ
หนึ่งนี้เป็นเพียงเล็กน้อยมากขึ้น ตรงไปตรงมาถ้า syntactically
ที่แตกต่างกันเล็กน้อยที่ฉันพูดคว้า องค์ประกอบที่ไม่ซ้ำกัน
ระบุเป็นปัจจัยการผลิต
นั่นคือสิ่งที่แท็กแฮช หมายถึง, รหัสเฉพาะ
แล้วฉันโทร. ส่ง
>> ดังนั้น. ส่งที่นี่เป็นฟังก์ชั่นอื่น ที่รู้จักกันเป็นวิธีการที่
ภายในของวัตถุในมือซ้าย ด้านข้างมีที่ผมไม่ได้เน้น
ดังนั้นหากคุณคิดของปัจจัยการผลิตเป็นวัตถุ ในหน่วยความจำ - และแน่นอนมันเป็น
มันเป็นโหนดในต้นไม้ -
. วิธีการส่งเมื่อฟอร์มนี้กับ ID นี้จะถูกส่งมาดำเนินการ
รหัสต่อไปนี้
ฉันไม่สนใจสิ่งที่ชื่อของ ฟังก์ชั่นที่ผมดำเนินการ
ดังนั้นที่นี่ฉันใช้เป็นมาก่อนว่ามีอะไร ฟังก์ชั่นที่เรียกว่าแลมบ์ดาหรือ
ฟังก์ชั่นที่ไม่ระบุชื่อ
มันไม่ได้อยู่ที่ทุกคนรู้ ที่น่าสนใจอื่น ๆ กว่าที่มีชื่อไม่มี
ซึ่งเป็นเรื่องปกติถ้าคุณเพียง เคยไปเรียกว่าครั้งเดียว
และภายในมีการจัดการที่จริงผม ส่งแบบฟอร์ม
ครั้งแรกที่ผมประกาศตัวแปร เรียกว่าค่า
และแล้วสิ่งที่เป็นผลของการนี​​้ ส่วนไฮไลต์ที่นี่ตอนนี้
สิ่งที่จะทำที่ ระดับสูงสำหรับฉันหรือไม่
>> ผู้ชม: จะได้รับค่าที่ ผู้ใช้ไม่ได้ใน HTML ที่ด้านล่าง
จะได้รับ ID ที่แล้ว พบว่าค่าของมัน
>> DAVID เจลัน: แน่นอน
มันคว้าโหนดที่มีที่ไม่ซ้ำกัน ระบุเป็นชื่อ
จะได้รับค่าที่อยู่ในนั้นซึ่ง คือสมมุติสิ่งที่ผู้ใช้
พิมพ์เขาหรือตัวเอง
และจากนั้นจะเก็บที่อยู่ใน ค่าตัวแปรที่เรียกว่า
เช่นกันคุณอาจจะยังมี การกระทำเช่นนี้แตกต่างกันเล็กน้อย
ทั้งหมดได้รับการยอมรับโดยการทำบางสิ่งบางอย่าง ค่าโกหก var ได้รับ
document.getElementById
และนี่คือเหตุผลที่มันเป็นเพียงเล็กน้อย น่าเบื่อที่จะไม่ใช้ jQuery
"ชื่อ" ค่า.
ดังนั้นเป็นที่ยอมรับกันโดยสิ้นเชิง
วิธีต่างๆในการทำเช่นนี้ jQuery เพียง มีแนวโน้มที่จะเป็นเพียงเล็กน้อยสั้นมากขึ้นและ
แน่นอนที่นิยมมากขึ้น ในหมู่โปรแกรมเมอร์
>> ตอนนี้ผมกำลังทำบิตของการมีสุขภาพจิตดี ตรวจสอบเพราะในปัญหา
คำสั่งเราอย่างชัดเจนกล่าวว่าถ้า ผู้ใช้ยังไม่ได้พิมพ์ แต่ของเขาหรือเธอ
ชื่อไม่แสดงการแจ้งเตือน
แต่คุณสามารถตรวจสอบว่าโดยเพียงแค่ ตรวจสอบสตริงที่ว่างเปล่าสำหรับ
อ้าง-นำมาอ้างว่ามี ไม่มีอะไรจริงมี
แต่ถ้ามันไม่เท่ากับคำพูดที่นำมาอ้าง-, ฉันต้องการที่จะเรียกการแจ้งเตือน
และเป็นส่วนหนึ่งที่น่าสนใจที่นี่เป็นที่ เรากำลังใช้ประกอบบวกซึ่ง
ไม่ว่าใน JavaScript?
concatenate
ดังนั้นมันก็เหมือน PHPs จุดประกอบ
ความคิดเดียวกันไวยากรณ์ที่แตกต่างกันเล็กน้อย
และฉันเพียงแค่การสร้างสตริงที่ คุณเห็นในการถ่ายภาพหน้าจอ -
สวัสดีดังนั้นจึง
>> แล้วรายละเอียดล่าสุดนี้
ทำไมฉันกลับภายในเท็จ ของการทำงานที่ไม่ระบุชื่อนี้
>> ผู้ชม: ไม่มีค่าเป็น
คุณใส่มันในรูปแบบ
มันก็บอกว่าถ้าค่าไม่ได้ เท่ากับว่างแล้วทำมัน
มีที่ว่างในการส่งที่เป็น
>> DAVID เจลัน: OK
ระวังว่า
ไม่มีใครที่นี่
และเท็จผลตอบแทนที่อยู่นอก ของถ้าเงื่อนไข
ดังนั้นนี่เน้นสายกลับเท็จ รันไม่ว่าสิ่งที่เมื่อ
การส่งแบบฟอร์ม
สิ่งที่ไม่กลับมาภายในเท็จนี้ ตัวจัดการเหตุการณ์ที่จะเรียกว่า
เหตุการณ์ในคำถาม ถูกส่ง?
>> ผู้ชม: เพ​​ราะมัน เพียง แต่เกิดขึ้นครั้งเดียว
>> DAVID เจลันเท่านั้นที่เกิดขึ้นครั้งเดียว
ไม่เชิง
ใช่?
>> ผู้ชม: จะป้องกันไม่ให้รูปแบบจาก ส่งไปยังการทำงานเริ่มต้นที่
ซึ่งจะทำให้การโหลดหน้า
>> DAVID เจลัน: แน่นอน
ดังนั้นฉันมากระยะการส่งที่นี่ เพราะฉันว่ารูปแบบเป็น
ที่ถูกส่งมา
แต่ในขณะที่คุณแนะนำก็จริงไม่ได้ ถูกส่งมาในทาง HTTP จริง
เมื่อคุณคลิกส่งเพราะของเรา จัดการ onSubmit เรา intercepting
ส่งแบบฟอร์มที่จึงจะพูด
แล้วเรากำลังทำสิ่งที่เรา ที่มีรหัส JavaScript
แต่ฉันกลับจงใจเท็จ เพราะสิ่งที่ฉันไม่ต้องการที่จะเกิดขึ้น
แยกที่สองต่อมาเป็นรูปแบบทั้ง ตัวเองที่จะถูกส่งไปยังเว็บ
เซิร์ฟเวอร์ที่มีคู่ค่าที่สำคัญโดยการเปลี่ยน URL ที่จะได้สิ่งที่ต้องการ
q = แมวหรือสิ่งที่เราได้ ตัวอย่างเช่นในชั้นเรียน
ฉันไม่ต้องการที่จะเกิดขึ้นเพราะ ไม่มีการฟังเซิร์ฟเวอร์สำหรับการนี​​้
ส่งแบบฟอร์ม
ก็ทำอย่างหมดจดในรหัส JavaScript
และนั่นคือเหตุผลที่ผมไม่ได้มี แอตทริบิวต์การกระทำในรูปแบบของฉันเพราะฉัน
ไม่ได้ตั้งใจสำหรับการ เคยไปที่เซิร์ฟเวอร์
>> ดังนั้นมันถูกส่งมา
แต่เรากำลังสกัดกั้นรูปแบบที่ การส่งและป้องกันการเริ่มต้น
พฤติกรรมซึ่งเป็นจริง ไปตลอดทางไปยังเซิร์ฟเวอร์
>> ผู้ชม: ดังนั้นการรักษาฝั่งไคลเอ็นต์
>> DAVID เจลัน: การรักษา มันฝั่งไคลเอ็นต์
ขวาตรง
ขึ้นต่อไปคือของฉันโอ้ MySQL
>> ROB สลิง: OK
ดังนั้นคำถามแรกนี้คือโดยทั่วไป สำหรับคนที่หยาบกร้าน
แม้ว่าคนต่อไปดีกว่า
ดังนั้นคุณจะต้องเลือกข้อมูลที่ถูกต้อง ประเภททั้งของคอลัมน์นี้
และทั้งสองคนนี้มีบางส่วน สิ่งที่เกี่ยวกับพวกเขาว่า
ให้ทางเลือกที่ยากลำบาก
ดังนั้น int ไม่ถูกต้อง ประเภทจำนวน
เหตุผลการบัญชี 12 หลัก จำนวน int ไม่ใหญ่พอที่จะ
ร้านค้ารวมหลัก
ดังนั้นทางเลือกที่ถูกต้องจะได้รับใหญ่ int ถ้าคุณเกิดขึ้นที่จะรู้ว่า
ทางเลือกหนึ่งที่จะได้รับ เขตถ่านของความยาว 12
ดังนั้นทั้งของผู้ที่จะได้ทำงาน
int จะไม่
>> ตอนนี้ความสมดุลคิดว่ากลับไป pset7
ดังนั้นเราจึงใช้เฉพาะทศนิยม เก็บค่าของหุ้น -
>> DAVID เจลัน: เงินสด
>> ROB สลิง: เงินสด
เราใช้ทศนิยมในการจัดเก็บจำนวน เงินสดที่ผู้ใช้ในปัจจุบันมี
ดังนั้นเหตุผลที่เราทำว่าเป็น เพราะจำลอย
มีจุดที่ลอยอยู่ในความแม่นยำเป็น
มันไม่สามารถเก็บเงินสดได้อย่างแม่นยำ ค่าเช่นเราต้องการที่นี่
ดังนั้นทศนิยมที่สามารถเก็บได้อย่างแม่นยำ สิ่งที่จะพูดทศนิยมสองตำแหน่ง
นั่นเป็นเหตุผลที่สมดุลที่เราต้องการมัน ให้เป็นทศนิยมและไม่ลอย
>> DAVID เจลัน: และยังเกินไป แต่ มันอาจจะเป็นฉลาดในที่อื่น
บริบทที่จะคิดว่าอาจจะนี้ เป็นโอกาสสำหรับ int
ฉันเพิ่งจะติดตาม สิ่งที่อยู่ในเหรียญ
เพราะเราได้แสดงให้เห็นอย่างชัดเจนเริ่มต้น คุณค่าของความ 100.00 ที่
หมายความว่ามันก็อาจจะ int
และความละเอียดอ่อนเกินไปกับจำนวนอื่น ก็คือว่ามันไม่ได้หมายความว่า
จะเป็นคำถามเคล็ดลับ
แต่จำได้ว่า int ใน MySQL, เช่นใน C อย่างน้อยใน
เครื่องเป็น 32 บิต
และถึงแม้ว่าเราไม่ได้คาดหวังให้คุณ ทราบว่ากี่หลักที่
หมายถึงไม่เรียกว่าใหญ่ที่สุดในจำนวน คุณสามารถแสดงที่อาจเกิดขึ้น
มีจำนวน 32 บิตประมาณคืออะไร
>> เราไม่จำนวนสิ่งที่มักจะพูดว่า
2 ถึง 32 ซึ่งเป็นสิ่งที่ประมาณ?
คุณไม่จำเป็นต้องรู้อย่างแม่นยำ
แต่ประมาณเป็นประโยชน์ในชีวิต
ก็ประมาณ 4 พันล้าน
ดังนั้นเราจึงได้บอกว่าไม่กี่ครั้ง
ฉันรู้ว่าฉันได้กล่าวว่าไม่กี่ครั้ง
และมันก็เป็นประมาณ 4 พันล้าน
และที่เป็นกฎที่ดี ของหัวแม่มือรู้
หากคุณมี 8 บิต, 256 คือจำนวนมายากล
หากคุณมี 32 บิต, 4 พันล้านหรือจะให้
ดังนั้นหากคุณเพียงแค่เขียนลง 4 พันล้าน คุณจะเห็นว่ามันเป็นตัวเลขน้อยกว่า
12 ซึ่งหมายความว่าไม่ชัดเจน ลึกซึ้งพอที่จะจับ
12 เลขที่บัญชีหลัก
>> ROB สลิง: OK
ดังนั้นคนอื่น ๆ ไปดีกว่า
ดังนั้นคิดว่าธนาคาร เรียกเก็บรายเดือน $ 20
ค่าบำรุงรักษาในบัญชีทั้งหมด
กับสิ่งที่แบบสอบถามได้ที่ธนาคาร หัก 20 $ จากทุกนับแม้ว่า
ผลในบางยอดเชิงลบได้อย่างไร
ดังนั้นโดยทั่วไปมีสี่ ประเภทหลักของการค้นหา -
แทรกเลือกปรับปรุงและลบ
ดังนั้นเราจึงทำในสิ่งที่คิดว่าเรา จะใช้ที่นี่
ปรับปรุง
>> ดังนั้นลองมาดู
ดังนั้นที่นี่เรากำลังอัปเดต
สิ่งที่เรามีตารางการปรับปรุงบัญชี?
ดังนั้นการปรับปรุงบัญชี
แล้วไวยากรณ์กล่าวว่าสิ่งที่ ในบัญชีที่เราปรับปรุง?
ดีที่เรากำลังตั้งค่าความสมดุลเท่ากับ มูลค่าปัจจุบันของความสมดุลลบ 20
ดังนั้นนี่จะปรับปรุงแถวทั้งหมด บัญชีการลบ
$ 20 จากยอดเงินคงเหลือ
>> DAVID เจลัน: ข้อผิดพลาดทั่วไปที่นี่ แม้ว่าบางครั้งเรายกโทษให้มัน
เป็นจริงมีโค้ด PHP ที่นี่ เรียกใช้ฟังก์ชันการค้นหาหรือการวาง
คำพูดทุกอย่างที่อยู่รอบ ๆ ไม่จำเป็นต้องมี
>> ROB สลิง: โปรดจำไว้ว่า MySQL เป็น ภาษาที่แยกต่างหากจาก PHP
เราจะได้รับการเขียน MySQL ใน PHP
และ PHP จะถูกส่งไปแล้ว ไปยังเซิร์ฟเวอร์
แต่คุณไม่จำเป็นต้อง PHP เพื่อที่จะ สื่อสารกับเซิร์ฟเวอร์
>> DAVID เจลัน: แน่นอน
ดังนั้นตัวแปรที่มีสัญญาณดอลลาร์ไม่ ควรจะอยู่ในบริบทนี้
มันก็สามารถทำทั้งหมดของคณิตศาสตร์ ภายในฐานข้อมูลของตัวเอง
>> ROB สลิง: OK
ดังนั้นหนึ่งต่อไป
นี้เป็นหนึ่งต่อไปหรือไม่
ใช่
ดังนั้นกับสิ่งที่แบบสอบถามได้ที่ธนาคาร ดึงหมายเลขบัญชีของ
ลูกค้าที่ร่ำรวยที่สุดผู้ที่มี ยอดคงเหลือมากกว่า 1,000?
เพื่อที่ทั้งสี่ประเภทหลัก เราจะต้องการที่นี่
เลือก
ดังนั้นเราจึงต้องการที่จะเลือก
สิ่งใดที่เราต้องการที่จะเลือก?
เราไม่คอลัมน์สิ่งที่ต้องการเลือก?
โดยเฉพาะเราจะต้องการ เพื่อเลือกหมายเลข
แต่ถ้าคุณบอกว่าดาวเรา ได้รับการยอมรับว่า
>> เพื่อเลือกหมายเลขจากตารางอะไร
บัญชี
แล้วเงื่อนไขที่เราต้องการได้หรือไม่
ที่สมดุลมากกว่า 1,000
นอกจากนี้เรายังได้รับการยอมรับมากขึ้น มากกว่าหรือเท่ากับ
ไฟล์ล่าสุด
กับสิ่งที่แบบสอบถามได้ที่ธนาคาร ใกล้ชิดนั่นคือลบทุกบัญชีที่
มีความสมดุลของ $ 0?
เพื่อที่สี่ของเรา จะต้องการที่จะใช้งานหรือไม่
ลบ
ดังนั้นไวยากรณ์สำหรับการที่ได้หรือไม่
ลบจากตารางอะไร
บัญชี
แล้วสภาพที่ เราต้องการที่จะลบ -
ที่สมดุลเท่ากับศูนย์
เพื่อลบแถวทั้งหมดจากบัญชี ที่สมดุลเป็นศูนย์
คำถามใด ๆ ของเหล่านี้หรือไม่
ต้องการที่จะคิว?
>> DAVID เจลัน: คู่มือคิว
ดังนั้นในที่นี้เราให้คุณบ้าง โครงสร้างที่คุ้นเคยที่เราสำรวจ
บิตในชั้นเรียนข้างของ structs, ซึ่งเป็นข้อมูลที่
โครงสร้างที่เกี่ยวข้องกับจิตวิญญาณ
ความแตกต่างแม้ว่าจะมีคิวเป็น ที่เราต้องจำไว้อย่างใดที่
เป็นที่ด้านหน้าของคิวในขนาดใหญ่ ส่วนหนึ่งเพื่อให้เราสามารถให้มากขึ้น
การใช้งานที่มีประสิทธิภาพของหน่วยความจำอย่างน้อย ถ้าเราใช้อาร์เรย์
>> เพราะจำได้ถ้าเรามีอาร์เรย์ถ้า เช่นนี้เป็นหน้าของ
คิวถ้าฉันได้รับเป็นคิวที่นี่ แล้วมีคนได้รับในบรรทัดที่
อยู่ข้างหลังผมอยู่ข้างหลังผมอยู่ข้างหลังผมและ คนคนหนึ่งก้าวออกมาจากแถวคุณ
จะทำได้อย่างที่เราเห็นบางส่วนของมนุษย์ของเรา อาสาสมัครในชั้นเรียนทุกคนมี
เปลี่ยนวิธีนี้
แต่โดยทั่วไปแล้วทุกคนต้องทำ สิ่งที่ไม่ใช้ที่ดีที่สุดของเวลา
ในโปรแกรมเพราะมันหมายถึงคุณ ขั้นตอนวิธีการทำงานในสิ่งที่
เวลาทำงานซีมโทติ?
มันเป็นเชิงเส้น
>> และฉันรู้สึกเหมือนว่าเป็นชนิดของโง่
ถ้าคนถัดไปในบรรทัดถัดไป คนที่ควรจะไปลงใน
เก็บพวกเขาไม่ได้ทุกคนต้องมี ที่จะย้ายไปอยู่ด้วยกัน
เพียงแจ้งให้บุคคลนั้นถูกดึงออก เมื่อเวลามาถึงตัวอย่างเช่น
ดังนั้นเราจึงสามารถบันทึกบิตของเวลาที่มี
และอื่น ๆ ที่จะทำ แต่หมายความว่า ที่หัวของคิวหรือ
ด้านหน้าของคิวเป็นไป ความก้าวหน้าย้ายลึกและลึก
เข้าแถวและในที่สุดก็อาจจะ ห่อรอบจริงถ้าเราใช้
อาร์เรย์ในการจัดเก็บคน ในคิวนี้
เพื่อให้คุณเกือบจะคิดว่า อาร์เรย์เป็นข้อมูลที่เป็นวงกลม
โครงสร้างในแง่ที่ว่า
>> ดังนั้นคุณก็ต้องติดตาม ขนาดของมันหรือจริงๆสิ้นสุดของมัน
แล้วที่จุดเริ่มต้นของมันคือ
ดังนั้นเราจึงเสนอว่าคุณประกาศ หนึ่งคิวดังกล่าวโทร
มัน q เพียงหนึ่งตัวอักษร
จากนั้นเราก็เสนอว่าด้านหน้าเป็น เริ่มต้นได้ที่ศูนย์และว่าขนาด
สามารถเริ่มต้นที่จะเป็นศูนย์
>> ดังนั้นตอนนี้ไม่มีอะไร ภายในของคิวที่
และเราขอให้คุณให้เสร็จสมบูรณ์ การดำเนินการของ enqueue ด้านล่างใน
เช่นวิธีการที่ฟังก์ชั่นที่จะเพิ่ม n ในตอนท้ายของ q แล้วกลับจริง
แต่ถ้า q เต็มหรือเชิงลบ ฟังก์ชั่นควรกลับเท็จ
และเราให้คุณทั้งคู่ ของสมมติฐาน
แต่พวกเขาไม่ได้จริงๆทำงาน ที่เกี่ยวข้องเพียงบูลที่มีอยู่แล้ว
เพราะเทคนิคบูลไม่ได้ อยู่ใน C เว้นแต่คุณมี
ไฟล์ส่วนหัวบาง
เพื่อให้เป็นเพียงให้แน่ใจว่ามี นี้ไม่ได้เป็นเคล็ดลับ
คำถามชนิดของสิ่งที่
>> ดังนั้น enqueue เรานำเสนอในตัวอย่าง การแก้ปัญหาในการดำเนินการดังต่อไปนี้
หนึ่งที่เราตรวจสอบก่อนอย่างง่ายดาย ผลไม้แขวนต่ำ
ถ้าคิวเต็มหรือหมายเลขที่ คุณกำลังพยายามที่จะแทรกน้อย
กว่าศูนย์ซึ่งเรากล่าวใน สเปคของปัญหาควร
ไม่ได้รับอนุญาตเพราะเราเพียงต้องการ ค่าที่ไม่ใช่เชิงลบแล้วคุณควร
เพียงแค่กลับเท็จทันที
ดังนั้นบางค่อนข้างง่าย การตรวจสอบข้อผิดพลาด
หาก แต่คุณต้องการที่จะเพิ่มที่เกิดขึ้นจริง จำนวนที่คุณต้องทำบิตของ
คิดที่นี่
และนี่คือที่มันน่ารำคาญเล็กน้อย จิตใจเพราะคุณจะต้อง
คิดออกว่าจะจัดการกับฟิล์ม
>> แต่เชื้อโรคของความคิดที่นี่ที่เป็นของ ที่น่าสนใจให้เราเป็นฟิล์มที่
มักจะหมายถึงการคำนวณแบบแยกส่วนและ ผู้ประกอบการ mod ด้านเปอร์เซ็นต์
ที่คุณสามารถไปจากค่าขนาดใหญ่ กลับไปที่ศูนย์แล้วหนึ่งและสองและ
สามรอบแล้วกลับไปอยู่ที่ศูนย์ หนึ่งและสองและสามและอื่น ๆ
ครั้งแล้วครั้งเล่า
ดังนั้นวิธีที่เรานำเสนอการทำเช่นนี้เป็น ที่เราไม่ต้องการที่จะเข้ามาในดัชนี
อาเรย์ที่เรียกว่าตัวเลขที่ จำนวนเต็มของเราอยู่
แต่การที่จะได้รับมีครั้งแรกที่เราต้องการจะทำ สิ่งที่ขนาดของคิวเป็น แต่
แล้วเพิ่มไปว่าสิ่งที่ ด้านหน้าของรายการเป็น
และผลกระทบของการที่จะนำเราที่ ตำแหน่งที่เหมาะสมในคิวและ
ไม่คิดว่าคนแรกในสาย เป็นที่จุดเริ่มต้นที่เขาหรือ
เธออาจจะเป็นอย่างแน่นอนถ้าเรา ก็ขยับทุกคน
แต่เราเพียงแค่การสร้างงาน สำหรับตัวเองถ้าเราเอา
โดยเฉพาะอย่างยิ่งเส้นทางที่
>> เพื่อให้เราสามารถให้มันค่อนข้างง่าย
เราต้องจำไว้ว่าเราเพียงแค่ เพิ่ม int คิว
และจากนั้นเราก็กลับจริง
ในขณะเดียวกันใน dequeue เราถาม คุณทำต่อไปนี้
ใช้มันในลักษณะที่มัน dequeues ที่เป็นลบและผลตอบแทน
int ที่ด้านหน้าของคิว
ในการลบ int มันพอเพียง ที่จะลืมมัน
คุณไม่จำเป็นที่จะแทนที่บิต
ดังนั้นจึงยังคงมีจริง
เช่นเดียวกับข้อมูลบนฮาร์ดไดรฟ์ เราก็ไม่สนใจความเป็นจริง
ว่ามันเป็นตอนนี้มี
และถ้า q ว่างเราควร แทนที่จะกลับเชิงลบ 1
ดังนั้นนี้รู้สึกโดยพลการ
ทำไมกลับเชิงลบ 1 แทนการเท็จ
ใช่
>> ผู้ชม: Q มีการจัดเก็บ ค่าบวก
เมื่อคุณเก็บเฉพาะค่าบวก ใน q ลบข้อผิดพลาด
>> DAVID เจลัน: ตกลงจริง
ดังนั้นเพราะเราเพียง แต่การจัดเก็บที่ดี ค่าหรือศูนย์แล้วก็ปรับให้
กลับเป็นค่าลบเป็นแมวมอง ค่าสัญลักษณ์พิเศษ
แต่คุณกำลังเขียนประวัติศาสตร์มี เพราะเหตุผลที่เรากำลังเพียง
กลับค่าที่ไม่ใช่เชิงลบ เป็นเพราะเราต้องการที่จะ
มีค่าแมวมอง
มากขึ้นโดยเฉพาะดังนั้นทำไมไม่เพียงแค่ กลับเท็จในกรณีของข้อผิดพลาด
ใช่
>> ผู้ชม: คุณเคยล้มเหลว เพื่อกลับจำนวนเต็ม
>> DAVID เจลัน: แน่นอน
และนี่คือที่ C ได้รับ สวยข้อ จำกัด
หากคุณกำลังจะบอกว่าคุณกำลังจะ เพื่อกลับ int คุณได้มี
เพื่อกลับ int
คุณไม่สามารถรับแฟนซีและเริ่มกลับมา บูลหรือลอยหรือ
สตริงหรือสิ่งที่ต้องการที่
ตอนนี้ขณะที่ JavaScript และ PHP และ ภาษาอื่น ๆ บางส่วนสามารถในความเป็นจริง
มีคุณกลับมาที่แตกต่างกัน ประเภทของค่า
และที่จริงจะมีประโยชน์ที่ คุณสามารถกลับ ints บวกศูนย์
ints ลบหรือเท็จหรือ null แม้จะมีความหมายผิดพลาด
แต่เราไม่ได้ว่า ความเก่งกาจใน C.
>> ดังนั้นด้วย dequeue สิ่งที่เรา เสนอที่จะทำคือ -
>> ROB สลิง: คุณสามารถกลับเท็จ
มันเป็นเพียงการผิดว่าเป็นกัญชา กำหนดเท็จให้เป็นศูนย์
ดังนั้นถ้าคุณกลับเท็จ คุณกลับเป็นศูนย์
และเป็นศูนย์เป็นสิ่งที่ถูกต้องในคิวของเรา ในขณะที่ลบ 1 ไม่ได้ถ้า
เท็จที่เกิดขึ้นจะเป็นเชิงลบ 1
แต่คุณไม่ควรจะได้ จำเป็นต้องรู้ว่า
>> DAVID เจลัน: นั่น เหตุผลที่ผมไม่ได้พูดมัน
>> ROB สลิง: แต่มันไม่เป็นความจริง ที่คุณไม่สามารถกลับเท็จ
>> DAVID เจลัน: แน่นอน
ดังนั้น dequeue สังเกตเรายอมรับ เป็นโมฆะเป็นอาร์กิวเมนต์
และนั่นเป็นเพราะเราไม่ได้ ผ่านอะไรค่ะ
เราเพียงแค่ต้องการที่จะลบองค์ประกอบ ที่ด้านหน้าของคิว
ดังนั้นวิธีที่เราอาจจะไปเกี่ยวกับการทำเช่นนี้?
ดีแรกให้ทำเช่นนี้ การตรวจสอบสุขภาพจิตดีได้อย่างรวดเร็ว
ถ้าขนาดคิวเป็น 0 มี งานที่จะทำไม่มี
กลับเชิงลบ 1
เสร็จสิ้น
เพื่อที่ว่าไม่กี่บรรทัดของโปรแกรมของฉัน
ดังนั้นเพียงสี่สายยังคงอยู่
>> ดังนั้นที่นี่ฉันตัดสินใจที่จะพร่อง ขนาด
และ decrementing ขนาดได้อย่างมีประสิทธิภาพ หมายความว่าฉันลืม
บางสิ่งบางอย่างที่อยู่ในนั้น
แต่ฉันยังมีการปรับปรุงที่ ด้านหน้าของตัวเลขที่มี
ดังนั้นจะทำอย่างไรที่ฉันต้องการ ทำสองสิ่ง
ครั้งแรกที่ผมต้องจำไว้ว่าจำนวน อยู่ที่ด้านหน้าของคิว
เพราะผมต้องกลับสิ่งที่
ดังนั้นผมจึงไม่ต้องการที่จะตั้งใจลืม เกี่ยวกับเรื่องนี้แล้วเขียนทับ
ฉันแค่จะต้องจำไว้ใน int
>> และตอนนี้ผมต้องการที่จะปรับปรุง q.front จะ q.front +1
ดังนั้นถ้าเรื่องนี้เป็นคนแรกใน สายตอนนี้ฉันต้องการจะทำบวก 1 ถึง
จุดที่คนถัดไปในบรรทัด
แต่ก็ต้องจัดการกับฟิล์มว่า
และถ้ากำลังการผลิตอย่างต่อเนื่องทั่วโลก ที่จะช่วยให้ฉันเพื่อให้แน่ใจว่า
ที่ผมชี้ไปที่คนสุดท้ายใน สายการทำงานแบบโมดูโลจะนำ
ผมกลับไปที่ศูนย์ที่ ด้านหน้าของคิว
และที่จัดการอันโตนี่
แล้วฉันจะกลับมาดำเนินการต่อ n
>> ตอนนี้อย่างเคร่งครัดพูดผมไม่ได้ ต้องประกาศ n
ฉันไม่ได้มีที่จะคว้ามันและเก็บไว้ ชั่วคราวเนื่องจากมีค่าเป็น
ยังคงมี
ดังนั้นฉันก็สามารถทำคณิตศาสตร์ที่เหมาะสม เพื่อกลับไปอดีตหัวหน้า
ของคิว
แต่ผมก็รู้สึกว่าเรื่องนี้เป็นที่ชัดเจนมากขึ้น ที่จริงคว้า int ใส่ไว้
ใน n แล้​​วกลับที่ เพื่อเห็นแก่ความชัดเจน แต่
ไม่จำเป็นอย่างเคร่งครัด
Psst
พวกเขากำลังทั้งหมดออกเสียงได้ในหัวของฉัน
>> ROB สลิง: คำถามแรกดังนั้น เป็นปัญหาต้นไม้ไบนารี
ดังนั้นคำถามแรกคือเรา ให้ตัวเลขเหล่านี้
และเราต้องการอย่างใดใส่ไว้ใน โหนดเหล่านี้ดังกล่าวว่าเป็น
ต้นไม้ค้นหาไบนารีที่ถูกต้อง
ดังนั้นสิ่งหนึ่งที่ต้องจำเ​​กี่ยวกับ ต้นไม้ค้นหาแบบไบนารีคือว่ามันไม่ได้
เพียงแค่ว่าสิ่งที่ไปทางซ้าย เป็นน้อยลงและสิ่งที่
ที่ถูกต้องมากขึ้น
มันต้องเป็นไปได้ว่าต้นไม้ทั้ง ด้านซ้ายเป็นน้อยลงและต้นไม้ทั้ง
ไปทางขวามากขึ้น
>> ดังนั้นถ้าผมใส่ 34 ที่นี่ที่ด้านบนแล้ว ฉันใส่ 20 ที่นี่เพื่อให้เป็นที่ถูกต้องเพื่อให้
ห่างไกลเพราะ 34 ขึ้นที่นี่
20 จะไปทางซ้าย
ดังนั้นที่น้อย
แต่ฉันไม่สามารถใส่แล้ว 59 ที่นี่เพราะ แม้ว่า 59 อยู่ทางด้านขวาของ 20,
ก็ยังคงที่ด้านซ้ายของ 34
ดังนั้นด้วยข้อ จำกัด ในใจว่า วิธีที่ง่ายที่สุดอาจจะแก้ปัญหานี้
ปัญหาคือเพียงแค่การจัดเรียง ของตัวเลขเหล่านี้ -
ดังนั้น 20, 34, 36, 52, 59, 106
แล้วใส่ที่ จากซ้ายไปขวา
>> ดังนั้น 20 ไปที่นี่
34 ไปที่นี่
36 ไปที่นี่
52, 59, 106
และคุณยังจะได้คิดออกด้วย บางเสียบและตระหนัก,
โอ้รอฉันไม่ได้มีจำนวนมากพอ เพื่อเติมเต็มในที่นี่
ดังนั้นผมจึงจำเป็นต้อง reshift สิ่งที่ฉัน บันทึกเส้นทางที่เป็นไปได้
แต่สังเกตเห็นว่าในขั้นสุดท้ายสามถ้า คุณอ่านจากซ้ายไปขวาก็อยู่ใน
การสั่งซื้อที่เพิ่มขึ้น
>> ดังนั้นตอนนี้เราต้องการที่จะประกาศสิ่งที่ struct เป็นไปได้สำหรับ
โหนดในต้นไม้ต้นนี้
ดังนั้นเราจึงทำในสิ่งที่ต้องการในต้นไม้ไบนารี?
ดังนั้นเราจึงมีค่าของชนิด int ดังนั้นค่า int บาง
ผมไม่ทราบว่าสิ่งที่เราเรียกว่า ในการแก้ปัญหา -
int n
เราจำเป็นต้องมีตัวชี้ไปยังเด็กซ้าย และตัวชี้ไปยังเด็กที่เหมาะสม
ดังนั้นมันจะมีลักษณะเช่นนี้
และเป็นจริงก่อนที่จะดู เมื่อไม่ทวีคูณเชื่อมโยง
สิ่งที่รายการเพื่อแจ้งให้ทราบล่วงหน้า -
ฉันจะต้องเลื่อนทั้งหมด ทางกลับลงไปที่ปัญหา 11
>> เพื่อแจ้งให้ทราบว่ามีลักษณะเหมือนกันนี้ ยกเว้นเราก็เกิดขึ้นที่จะเรียกเหล่านี้
ชื่อที่แตกต่างกัน
เรายังมีจำนวนเต็ม ค่าและสองตัวชี้
มันเป็นเพียงที่แทนการรักษา ตัวชี้เป็นชี้ไปที่สิ่งต่อไปที่
และสิ่งที่ก่อนหน้านี้เรากำลังรักษา ตัวชี้ชี้ไปที่เด็กซ้าย
และเด็กที่ถูกต้อง
ตกลง
เพื่อให้เป็นโหนด struct ของเรา
และตอนนี้ฟังก์ชั่นเดียวที่เราต้อง ใช้ในการนี​​้คือการสำรวจที่
เราต้องการที่จะไปในช่วงต้นการพิมพ์ ออกค่าของต้นไม้ที่อยู่ในลำดับที่
>> ดังนั้นมองหาที่นี่เราจะต้องการพิมพ์ ออก 20, 34, 36, 52, 59, และ 106
เราจะประสบความสำเร็จได้อย่างไรว่า?
ดังนั้นจึงเป็นที่สวยเหมือนกัน
หากคุณเห็นในการสอบที่ผ่านมาปัญหาที่เกิดขึ้น ที่คุณต้องการที่จะพิมพ์ออกมา
ต้นไม้ทั้งหมดที่มีเครื่องหมายจุลภาคในระหว่าง ทุกอย่างก็เป็นจริงได้
ง่ายกว่าที่
ดังนั้นนี่คือการแก้ปัญหา
นี้อย่างมีนัยสำคัญได้ง่ายขึ้น ถ้าคุณทำมันซ้ำ
ผมไม่ทราบว่าถ้าใครพยายาม ที่จะทำซ้ำ
>> แต่ก่อนที่เราจะมีกรณีฐานของเรา
ถ้ารากเป็นโมฆะ?
แล้วเรากำลังจะกลับ
เราไม่ต้องการที่จะพิมพ์อะไร
อื่นที่เรากำลังจะเข้าไป ซ้ำลง
พิมพ์ทรีย่อยด้านซ้ายทั้งหมด
ดังนั้นทุกอย่างที่พิมพ์น้อย กว่ามูลค่าปัจจุบันของฉัน
แล้วฉันจะพิมพ์ตัวเอง
แล้วฉันจะ recurse ลงของฉัน ทรีย่อยที่เหมาะสมทั้งเพื่อให้ทุกอย่าง
มากกว่าค่าของฉัน
และนี่คือที่จะพิมพ์ ทุกสิ่งที่อยู่ในลำดับที่
คำถามที่เกี่ยวกับวิธีการนี​​้จริง สำเร็จหรือไม่
>> ผู้ชม: ผมมีคำถาม บน [ไม่ได้ยิน]
>> ROB สลิง: ดังนั้นวิธีหนึ่งในการเดินเข้ามาใกล้ ปัญหาซ้ำใด ๆ ที่เป็นเพียงแค่คิด
เกี่ยวกับเรื่องนี้ชอบที่คุณต้องคิด เกี่ยวกับทุกกรณีมุม
เพื่อพิจารณาว่าเราต้องการที่จะ พิมพ์ต้นไม้ทั้งหมดนี้
ดังนั้นสิ่งที่เรากำลังจะมุ่งเน้นไปที่ เป็นโหนดนี้โดยเฉพาะอย่างยิ่ง -
36
เรียก recursive เราหลอก เพียง แต่ผู้ที่ทำงาน
ดังนั้นที่นี่โทรซ้ำนี้เพื่อ การสำรวจของเราโดยไม่ได้คิด
เกี่ยวกับเรื่องนี้เพียงแค่ภายในซ้าย สามคิดว่าแล้วพิมพ์ 20
และ 34 สำหรับเรา
และจากนั้นเมื่อในที่สุดเราก็ซ้ำ เรียกการสำรวจเมื่อวันที่
ขวาที่ถูกต้องจะพิมพ์ 52, 59, และ 106 สำหรับเรา
>> ได้รับเพื่อให้นี้สามารถพิมพ์ 20, 34, และ อื่น ๆ ที่สามารถพิมพ์ 52, 59, 108,
ทั้งหมดที่เราต้องสามารถที่จะทำคือการพิมพ์ เราเองอยู่ตรงกลางของที่
ดังนั้นทุกสิ่งที่พิมพ์ออกมาก่อนเรา
พิมพ์เองจึงพิมพ์โหนดปัจจุบัน 36, printf ปกติแล้ว
พิมพ์ทุกอย่างที่ตามเรามา
>> DAVID เจลัน: นี่คือที่เรียกซ้ำ ได้รับสวยงามจริงๆ
มันเป็นก้าวกระโดดที่น่าตื่นตาตื่นใจนี้ของความศรัทธาที่ ที่คุณทำบิตน้อยที่สุดของการทำงาน
แล้วคุณจะปล่อยให้คน อื่นทำส่วนที่เหลือ
และว่าคนอื่น เป็นกระทบกระเทียบคุณ
ดังนั้นสำหรับจุดบราวนี่อย่างจริงจังถ้า คุณเลื่อนขึ้นไปบนคำถาม -
>> ROB สลิง: ในคำถาม?
>> DAVID เจลัน: และลงเล็กน้อยที่ ตัวเลขที่ไม่มีใครรู้ว่า
ตัวเลขเหล่านี้มาจากไหน
>> ROB สลิง: ฉันมีความคิดอย่างแท้จริง
>> DAVID เจลัน: พวกเขาปรากฏ ตลอดการทดสอบ
>> ผู้ชม: พวกเขาหมายเลขเดียวกันได้หรือไม่
>> DAVID เจลัน: ตัวเลขเหล่านั้น
ไข่อีสเตอร์เล็ก ๆ น้อย ๆ
ดังนั้นสำหรับบรรดาของคุณดูออนไลน์ได้ที่ บ้านถ้าคุณสามารถบอกเราผ่านทางอีเมลไปยัง
heads@CS50.net สิ่งที่สำคัญ ของเหล่านี้ที่เกิดขึ้นหกตัวเลข
ตลอดการทดสอบที่ 1 เราจะอาบน้ำให้คุณ ด้วยความสนใจที่น่าตื่นตาตื่นใจที่สุดท้าย
การบรรยายและลูกความเครียด
ดีบอบบาง
>> ROB สลิง: ใด ๆ คำถามสุดท้าย เกี่ยวกับสิ่งที่เกี่ยวกับการทดสอบหรือไม่