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 สลิง: ใด ๆ คำถามสุดท้าย เกี่ยวกับสิ่งที่เกี่ยวกับการทดสอบหรือไม่