-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

算法第一步(Python版)

( 簡體 字)
作者:葉蒙蒙類別:1. -> 程式設計 -> 演算法
   2. -> 程式設計 -> Python
譯者:
出版社:電子工業出版社算法第一步(Python版) 3dWoo書號: 53820
詢問書籍請說出此書號!

缺書
NT售價: 445

出版日:1/1/2021
頁數:272
光碟數:0
站長推薦:
印刷:全彩印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121391279
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

筆者第一次接觸編程是20 世紀80 年代,當時參加了宋慶齡兒童活動中心舉辦的一項編程體驗活動,就是照著前面黑板上寫的代碼在現場的機器上敲一遍,然后運行。當時到底用的是什么語言已經記不清了,但是還記得花費了好大力氣,摸索著敲了一遍完全不清楚其含義的字符串,然后按照說明運行,最終毫無動靜。雖然請教了巡場的工作人員,但他們也不知道是什么問題,到離場時都沒能讓程序“跑”起來——難道,編程就是要用計算機“寫”一堆“ 密碼”嗎?如果這堆密碼“跑”起來了,又會是怎樣的效果呢?
初次不成功的體驗后,直到20 世紀90 年代中期,因為學校開設了計算機課,筆者才再度接觸編程。老師在課堂上講了一點Basic 語言知識,編寫的是a+b=c 之類的程序,然后運行得出結果。筆者由此知道了編程語言,期末考試成績也不錯,但對于編程是什么,計算機能干什么,還是不明所以。國外的影視劇中用計算機能做生意,能管理企業,但我們編寫的程序只能做算術題,這是為什么呢?
上大學后,除了編程語言,筆者還學習了“數據結構”、“計算機原理”、“計算機體系結構”、“編譯原理”、“操作系統”和“軟件工程”等專業課程,這才逐漸明白了“編程”這一表面現象背后的體質:算法是怎么回事,計算機是如何運行的,為什么我們輸入的靜態字符能夠變成動態的程序,通過其“跑動”來滿足人們的需求……并由此了解到編程其實就是實現算法的過程。
算法,才是編程的核心。
后來進入職場,成了程序員,十幾年一路走來,始終在一線研發崗位,開發過不同類型的實踐項目,在開發過程中不斷學習、揣摩,才逐漸領悟到抽象算法和現實問題之間的關系:軟件開發就是通過各種算法實現具體的業務邏輯,把繁雜的過程抽象化、可計算化的過程。
而軟件開發工作背后的思維邏輯(將一個個具體的問題及其解決方案表達成計算機可以處理的形式,并設計計算的方式,將客觀世界解釋為一個復雜的信息處理過程)則被稱為計算思維,其具體表現如下:
* 把一個大問題分解為一個個子問題,然后進一步分解為一個個子子問題……直到無須分解。
* 分別執行一個個最小規模的問題。
* 按照問題劃分的結構將各個小問題的結果組成整個問題的結果。
也就是自上而下進行結構化的設計,遇到問題“分而治之,各個擊破”。這種解決問題
的方法并不是計算機專業獨有的,完全可以脫離編程而存在,并且是各行各業都需要的:
* 準備一桌宴席應該怎么做?先確定總共有幾道菜;然后購買原料,逐一烹調,裝盤上桌——這是分而治之的過程。
* 創作一幅漫畫應該怎么做?先確定故事背景、人物設置;然后構思主題、情節,繪制分鏡頭腳本;最后將每個分鏡頭的草圖通過精描、上色等步驟繪制成成品圖——這也是分而治之的過程。
* 舉辦一場學術會議應該怎么做?先確定主題、主講人、參會群體、場地;然后分頭準備(如邀請主講人、確定演講題目、制定日程)、租用/ 借用場地、協調交通、布置會場;最后招募參會者,注冊、繳費,安排各項活動——這也是分而治之的過程。
* 開辦一家餐館應該怎么做?
* 拍攝一部電影應該怎么做?
* 研發一款電動汽車應該怎么做?
* 建設一個高新科技開發區應該怎么做?
* ……
計算思維不僅提出了一套解決問題的方法論,而且非常強調實踐性——解決方案不是理論正確就可以,而是要在實際中可行才可以。
這個特點是由計算思維的誕生背景所決定的——當計算機科學家處理問題時,除了需要知道如何將一個問題抽象為計算機能夠理解的可計算模型,還要能夠將計算收斂到有限空間中得到結果。如果算法的時空復雜度過大,以當前的算力在有效求解的時間內無法得出結果,那么再完美的理論算法也無法在現實中奏效。
世界上的問題有大有小,所需要的資源有多有少,但抽象到最高層面的方法論可以是一致的。計算思維是各行各業都需要的。
掌握計算思維單靠理論學習是遠遠不夠的,必須經由大量的實踐。編程實踐就是習得計算思維的最佳方式。
既然要進行編程實踐,學習編程語言和工具的使用方法當然是必不可少的。但語言、工具都只是皮毛,隨著計算機技術的發展,編程語言日益增加,各種工具日新月異,“保質期”越來越短。而經由現實問題提煉出來的經典算法卻經得起時間的考驗。
從計算機被發明出來到現在,一些邏輯層面的基礎問題在大多數應用領域都會用到。
許多應用層繁多的花樣,最終對應的都是共同的基礎問題。計算機領域的科研人員、開發者,在幾十年的工作中,針對一些歷史悠久、應用廣泛、高頻出現的問題,研發出了對應的精致、高效的算法,我們將這些算法稱為經典算法。
計算機的經典算法也有多種,但其中重要且常用的相對有限,主要有:
* 針對序列數據的查找算法和排序算法是基礎。
* 針對樹和圖數據結構的各種算法:首先是遍歷算法(深度優先和廣度優先);然后是各種類型的樹結構,以及以計算圖中不同頂點間最短路徑為目的的各種算法。
* 若干用于解決數學問題(求最大公約數等)的計算機算法。
通過對經典算法的研習和實踐,掌握“用數值表達現實事物,用運算描述任務目標,
再通過算法處理數據找到到達目標的最優路徑”的方法論。如此,既是一種有效的思考力訓練,又是形成計算思維的過程。由此形成的思維能力是內力,而同步掌握的編程技能則屬外功。
從長遠來看,學習編程可以提升人們的計算思維水平;就近期來看,掌握一門正在日益變得通用的技能非常重要。
本書針對沒有任何程序設計基礎的讀者,同步講解兩方面內容:使用Python 語言編寫程序;基礎經典算法。由編程學算法,以算法促編程。同時,為了幫助讀者理解算法,本書還介紹了計算機的基礎運行原理。
在大學計算機專業課程中,本書所介紹的內容往往被拆分在如下幾門課程中:
* 程序設計語言(如Python)
* 數據結構
* 計算機組成原理和體系結構
本書將幾個領域的知識融合在一起,從日常事物開始,介紹軟件、程序、算法和編程分別是什么;然后重點介紹編程的兩大要素,即控制流程和數據結構,并詳細介紹了幾種常見的數據結構(如數組、鏈表、樹和圖),在此過程中,由數據結構的限制和實現引出現代電子計算機的基礎——二進制和馮?諾依曼結構;最后進入算法階段,從最簡單的順序查找開始,一邊介紹算法,一邊介紹它們的編程實現,詳細介紹的經典算法包括順序查找、二分查找、簡單排序(包括選擇排序、起泡排序、插入排序)和快速排序。
介紹具體算法無法脫離背后的原則,所以本書還介紹了作為快速排序思維基礎的分治策略和引自數學的遞歸等算法策略。為了使零基礎的讀者能夠上手編程,本書從操作角度闡述了編程工具的使用和程序編寫、運行、調試的過程。
如此安排本書的內容主要源于以下兩點:
* 使讀者在接觸編程的最初階段就能夠明確編程的核心是算法,從而將掌握算法策略、原理和過程作為學習重點,而不必將過多精力投入編程語言的語法或工具的操作等 “易過期”的細節上。
* 在學習理論算法的同時能夠時刻聯系實際,使讀者不僅可以理解算法本身在不同應用場景中的優點和缺點,還可以運用算法解決現實中的問題,并培養讀者的計算思維。
為了寫作本書,筆者專門邀請了兩位零基礎的同學作為學生,按照上述思路,為她們上了為期一年的“算法編程同步學”課程。本書就是根據這門課程的教案整理而成的。在此特別感謝康牧心和任臻同學。
內容簡介:

本書針對零基礎的初學者,以算法為核心,以編程為手段,最終的目的是培養讀者的計算思維。本書涉及大學計算機課程中程序設計、數據結構和計算機原理等多個領域的知識,從程序、編程和算法是什么入手;然后重點介紹了控制流程和數據結構,并針對數據結構的限制和實現剖析了現代電子計算機的基礎:二進制和馮·諾依曼結構;最后重點介紹了6大經典算法的原理、過程和編程實現,以及其背后的算法策略。為了使零基礎的讀者能夠上手編程,本書從操作角度闡述了編程工具的使用和程序編寫、運行、調試的過程。
目錄:

第1章 認識算法
1.1 算法究竟是什么
1.1.1 廣義的算法
1.1.2 計算機領域的算法
1.2 程序、編程和算法之間的關系
1.2.1 算法與程序
1.2.2 算法與編程
1.2.3 學習算法和編程的用處
1.3 學習算法的深度
1.3.1 掌握算法的5個層次
1.3.2 對應不同層次的講解方法
1.3.3 算法驅動編程
1.3.4 算法的難點:從原理到實現

第2章 萬事的抽象:控制流程
2.1 認識流程
2.1.1 順序
2.1.2 順序結構
2.1.3 條件(分支)
2.1.4 條件(分支)結構
2.1.5 循環(迭代)
2.1.6 循環(迭代)結構
2.2 用簡單的結構表達復雜的過程:控制結構的排列和嵌套
2.2.1 什么是流程圖
2.2.2 極簡版流程圖符號表
2.2.3 最簡單的流程圖
2.3 流程圖的粒度與嵌套
2.3.1 粒度
2.3.2 嵌套
2.3.3 條件結構和循環結構的嵌套
2.3.4 粒度均衡的流程圖

第3章 計算機是如何運行的
3.1 數據
3.1.1 信息數字化
3.1.2 數據化與數據
3.1.3 數據的組織
3.1.4 數據結構
3.2 計算機原理淺釋
3.2.1 電子計算機的前世今生
3.2.2 馮?諾依曼結構
3.2.3 存儲空間的地址和內容
3.2.4 一條指令是如何被執行的
3.2.5 馮?諾依曼結構的直觀解釋
3.2.6 馮·諾依曼結構的應用
3.2.7 馮·諾依曼結構的瓶頸
3.2.8 哈佛結構

第4章 萬物的抽象:數據結構
4.1 認識數據結構
4.1.1 數組
4.1.2 鏈表
4.2 直觀理解數據結構
4.2.1 數組與鏈表
4.2.2 數組與鏈表之同
4.2.3 數組與鏈表之異
4.3 預留給貨物的固定貨架:內存中的數組
4.3.1 存儲空間
4.3.2 數組:一塊連續的存儲空間
4.3.3 數組的下標
4.3.4 數組中的元素
4.3.5 數組的元素值
4.3.6 數組的特性
4.3.7 連續存儲惹的禍
4.4 見縫插針地擺放貨物:內存中的鏈表
4.4.1 鏈表
4.4.2 鏈表的編輯
4.5 數據結構的特性和發展
4.5.1 特性各異的鏈表與數組
4.5.2 數據結構的發展

第5章 復雜一些的數據結構:圖和樹
5.1 圖
5.1.1 圖的定義和分類
5.1.2 相關概念和算法
5.2 樹
5.2.1 樹的定義
5.2.2 二叉樹
5.3 遍歷算法
5.3.1 樹的遍歷和圖的遍歷
5.3.2 二叉樹的深度優先遍歷算法
5.3.3 二叉樹的廣度優先遍歷算法
5.4 圖和樹的現實意義
5.4.1 圖的抽象
5.4.2 樹的抽象
5.5 圖和樹
5.5.1 樹是圖的真子集
5.5.2 樹比圖更加嚴謹

第6章 第一行Python代碼
6.1 跟你的計算機聊天:編程語言
6.1.1 什么是編程語言
6.1.2 從低級語言到高級語言
6.1.3 編譯和解釋
6.2 直觀感受不同的編程語言
6.3 一條可愛的小蟒蛇:Python語言
6.3.1 主流編程語言
6.3.2 為什么選擇Python
6.3.3 Python的特性
6.3.4 結合數組與鏈表的優點的列表
6.4 Python的編輯、運行環境
6.4.1 順序安裝
6.4.2 創建項目
6.4.3 開始編寫第一個程序
6.5 第一個Python程序:讓Python小蟒蛇動起來
6.5.1 你好世界
6.5.2 運行Python程序的幾種方式
6.5.3 編程語言的基本概念
6.5.4 Python中的print()函數

第7章 開始用Python語言編寫程序
7.1 數據值和數據類型
7.1.1 數據的抽象和具象含義
7.1.2 數據類型
7.2 標識符
7.3 字面量、變量和常量
7.4 變量賦值
7.4.1 賦值的方式
7.4.2 賦值前無須聲明類型
7.4.3 賦值后不能隱性轉換類型
7.5 Python中的數組
7.5.1 邏輯上的數組
7.5.2 列表和元素
7.5.3 列表的賦值和復制
7.6 Python中的流程控制
7.6.1 用縮進劃分代碼塊
7.6.2 關鍵字
7.6.3 Python中的3種控制結構
7.6.4 不同類型結構的嵌套

第8章 實現第一個算法并衡量其優劣
8.1 從最簡單的算法開始學:順序查找
8.1.1 什么是查找算法
8.1.2 查找算法的要素
8.1.3 順序查找
8.2 順序查找的數據結構和控制流程
8.2.1 數據結構
8.2.2 控制流程
8.3 用Python實現順序查找算法
8.3.1 用變量和賦值重繪流程圖
8.3.2 代碼實現
8.4 用for語句實現順序查找算法
8.4.1 Python循環關鍵字:for和while
8.4.2 用for循環實現順序查找算法
8.5 如何衡量算法的性能
8.5.1 時間復雜度
8.5.2 常見算法的時間復雜度
8.5.3 空間復雜度

第9章 簡單但有用的經典查找算法
9.1 猜數游戲
9.1.1 游戲規則
9.1.2 不限制猜測次數的游戲的必勝攻略
9.1.3 限制猜測次數的猜數游戲
9.2 從“挨著找”到“跳著找”
9.3 二分查找:從原理到形式化描述
9.3.1 二分查找的原理
9.3.2 結構化的自然語言描述——流程圖
9.3.3 形式化描述第一步——變量和賦值
9.4 二分查找的編程實現
9.4.1 形式化流程控制
9.4.2 從流程圖到代碼
9.5 二分查找的性能
9.5.1 二分查找的時間復雜度
9.5.2 二分查找的空間復雜度

第10章 程序中的函數
10.1 計算機領域的函數
10.1.1 編程中的函數
10.1.2 函數的定義
10.1.3 函數的調用
10.1.4 二分查找函數
10.2 函數的作用
10.2.1 重用
10.2.2 抽象和封裝
10.2.3 從程序之外獲得數據
10.3 函數的參數
10.3.1 函數的參數及其值的變化
10.3.2 Python的函數參數傳遞
10.3.3 函數參數問題的簡化理解

第11章 編程實現猜數游戲
11.1 用Python實現猜數游戲
11.1.1 猜數游戲與二分查找
11.1.2 編寫猜數游戲攻擊者輔助程序
11.2 修改后的猜數小助手為什么輸了
11.3 Bug
11.4 Bug的天敵——Debug
11.4.1 什么是Debug
11.4.2 常用Debug方法:打印變量中間值
11.5 和Bug斗智斗勇
11.5.1 Bug的嚴重性
11.5.2 產生Bug的原因
11.5.3 防止Bug產生危害的方法

第12章 二分查找的變形
12.1 二分查找變形記:重復數列二分查找
12.1.1 包含重復元素數列的二分查找
12.1.2 包含重復元素數列的二分查找的變形
12.2 讓變形更高效:與經典二分查找相同的時間復雜度
12.2.1 包含重復元素數列的二分查找的時間復雜度
12.2.2 時間復雜度的計算
12.2.3 包含重復元素數列的二分查找的O(log(n))算法
12.3 二分查找再變形:旋轉數列二分查找
12.3.1 有序數列的旋轉
12.3.2 不包含重復元素旋轉數列的二分查找
12.3.3 算法實現
12.3.4 代碼優化
12.4 包含重復元素旋轉數列的二分查找

第13章 認識排序算法
13.1 處處可見的排行榜
13.1.1 什么是排序
13.1.2 排序算法的江湖地位
13.1.3 無處不在的排行榜
13.2 排序算法的分類
13.2.1 排序算法的分類方式
13.2.2 比較排序
13.2.3 比較排序的局限和優勢
13.3 排序算法的基本操作:兩兩交換數組中的元素
13.3.1 查找算法和排序算法
13.3.2 兩兩交換數組中的元素
13.3.3 swap()函數
13.3.4 沒有返回值的swap()函數

第14章 幾種簡單排序算法
14.1 撲克牌游戲
14.1.1 用撲克牌做一個小游戲
14.1.2 排序要解決的問題
14.1.3 基于直覺的排序算法
14.2 選擇排序
14.2.1 算法原理
14.2.2 數據結構
14.2.3 算法步驟
14.2.4 編程實現
14.3 起泡排序
14.3.1 歷史
14.3.2 算法原理
14.3.3 算法步驟
14.3.4 編程實現
14.3.5 算法優化
14.4 插入排序
14.4.1 算法原理:又見撲克牌
14.4.2 在數組中插入元素
14.4.3 算法步驟
14.4.4 編程實現
14.5 簡單排序概述
14.5.1 排序的時間復雜度
14.5.2 排序的空間復雜度
14.5.3 簡單排序算法性能總結

第15章 必須掌握的排序算法
15.1 快速排序
15.1.1 一個“笑話”
15.1.2 算法原理
15.1.3 算法的江湖地位
15.1.4 算法步驟
15.2 快速排序的時間復雜度
15.2.1 時間復雜度的計算
15.2.2 最佳時間復雜度
15.2.3 最差時間復雜度
15.2.4 平均時間復雜度
15.2.5 理解快速排序的平均時間復雜度
15.3 快速排序的空間復雜度
15.3.1 簡單的分區函數
15.3.2 優化分區函數
15.4 解讀分區算法源代碼
15.4.1 “人肉計算機”法
15.4.2 打印解讀法
15.5 編程實現快速排序算法
15.5.1 分治策略
15.5.2 快速排序的分與治
15.5.3 編程實現快速排序算法

第16章 遞歸實現快速排序
16.1 遞歸:像“貪吃蛇”一樣“吃掉”自己
16.1.1 歷史悠久的概念
16.1.2 無效遞歸
16.1.3 有效遞歸
16.1.4 分形
16.1.5 斐波那契數列
16.2 遞歸函數
16.2.1 遞歸和分治
16.2.2 遞歸函數
16.2.3 最簡單的遞歸函數
16.2.4 Python 限制遞歸深度
16.2.5 限制運行次數的遞歸函數
16.2.6 遞歸實現斐波那契數的計算
16.3 實現遞歸式快速排序
16.3.1 遞歸式快速排序的原理
16.3.2 遞歸式快速排序的編程實現
16.3.3 算法性能
16.4 測試算法程序
16.4.1 構造測試數據集
16.4.2 安裝 pip 和用 pip 安裝模塊
16.4.3 用生成數據測試快速排序
16.4.4 分區函數帶來的差異

第17章 算法精進
17.1 如何算學會了一個算法
17.1.1 以二分查找為例了解“掌握算法的幾個層次”
17.1.2 依據掌握的知識解決問題
17.1.3 學習算法的誤區
17.2 學會之后——創新
17.3 如何自學算法
17.3.1 自學三要素
17.3.2 學習材料和內容
17.3.3 學習目的和深度
17.3.4 學習方法
17.3.5 如何閱讀代碼
17.3.6 練習與實踐
17.4 說說刷題
序: