色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

算法的泛化問題,這些坑你可能都經歷過!|周立功教你學軟件設計

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:電子大兵 ? 2017-09-01 09:18 ? 次閱讀

第一章為程序設計基礎,本文為1.6.3泛型編程

>>>>1.泛型編程

下面將進一步以一個簡單的循環查找為例,全面考察算法的泛化問題。假設要編寫一個findValue()函數,在array數組中尋找一個特定的int值,詳見程序清單 1.29。

程序清單 1.29 findValue()查找函數(1)

1 int *findValue(int *arrayHead, int arraySize, int value)

2 {

3 for(int i =0; i < arraySize; ++i)?

4 if(arrayHead[i] == value)

5 break;

6 return &(arrayHead[i]);

7 }

該函數在某個范圍內查找value,返回的是一個指針,指向它所找到的第一個符合條件的元素。如果沒有找到,則返回最后一個元素的下一個位置(地址)。“最后元素的下一個位置”稱為end,其作用是返回end表示“查找無結果”,為何不返回null呢?因為end指針可以對其它種類的數據結構帶來泛化的效果,這是null做不到的。

在學習數組時,我們就被告誡,千萬不要超越其下標范圍,但事實上一個指向array元素的指針,不但可以合法地指向array的任何位置,也可以指向array尾端以外的任何位置。只不過,當指針指向array尾端以外的位置時,它只能用于與其它array指針相比較,不能間接引用其值。findValue()函數的使用方式如下:

const int arraySize = 7;

int array[arraySize] = {0, 1, 2, 3, 4, 5, 6};

int *end = array + arraySize;

int *ip = findValue(array, sizeof(array) / sizeof(int), 4);

if(ip == end)

return false;

else

return true;

顯然,findValue()函數暴露了數組的實現細節,比如,arraySize,太過于依賴特定的數據結構。那么,如何設計一個算法,使它適用于大多數數據結構呢?或者說,如何在即將處理的未知的數據結構上,正確地實現所有的操作呢?事實上,一個序列有開始和結尾,既可以使用++得到下一個元素,也可以使用“*”得到當前元素的值。

顯然,讓閱讀代碼的人理解你的本意,至關重要是取一個不會讓人產生誤解的名字。對于包含范圍,常用first和last。對于包含/排序范圍,常用begin和end。比如,對于大多數需要分片的數組,使用begin和end表示包含/排除范圍是最好的選擇。遺憾的是,類似limit、filter和length這樣具有多義性的英文單詞會帶來一定的困惑,而定義一個值的上限或下限時,max_和min_就是很好的前綴。

為了讓findValue()函數適用于所有類型的數據結構,其操作應該更抽象化,讓findValue()函數接受兩個指針作為參數,表示一個操作范圍,詳見程序清單 1.30。

程序清單1.30findValue()查找函數(2)

1 int *findValue(int *begin, int *end, int value)

2 {

3 while(begin != end && *begin != value)

4 ++begin;

5 return begin;

6 }

由于findValue函數的返回值begin是一個指針,因此該函數是一個返回指針的函數,即指針函數。這個函數在“前閉后開”范圍[begin, end)內(包含了begin迭代器的當前元素,而到end迭代器的前一個元素為止)查找value,并返回一個指針,指向它所找到的第一個符合條件的元素,如果沒有找到就返回end。這里之所以用“!=”,而不是用“<”判斷是否到達數組的尾部,因為這樣處理更精確。findValue()函數的使用方式如下:

const int arraySize = 7;

int array[arraySize] = {0, 1, 2, 3, 4, 5, 6};

int *end = array + arraySize;

int *ip = findValue(array, end, 4);

if(ip == end)

return false;

else

return true;

當然,findValue()函數也可以方便地用于查找array的子范圍:

int *ip = findValue(array + 2, array + 5, 3);

if(ip == end)

return false;

else

return ture;

由此可見,findValue()函數中并無任何操作是針對特定的整數array的,即只要將操作對象的類型加以抽象化,且將操作對象的表示法和范圍目標的移動行為抽象化,則整個算法就可以工作在同一個抽象層面上了。通常將整個算法的過程稱為算法的泛型化,簡稱泛化。泛化的目的旨在使用同一個findValue()函數處理各種數據結構,通過抽象創建可重用代碼。

如果一個序列是有序的,則不需要用finValue()從開始位置查找,可以使用標準C提供的bsearch()二分查找算法。對于一個更長的序列,二分查找也比findValue()線性查找法的速度更快。即使序列中只有10個元素,也足以體現二分查找的比較優勢。對于一個有1000個元素的序列,最多需要進行10次比較,其查找的速度要快200倍。

顯然,求數組中元素的最大值,其最好的方法是通過傳遞2個指針指定元素范圍。一個指針標識數組的開頭,另一個指針標識數組的尾部。比如:

int iMax(const int *begin, const int *end);

顯然,如果只是傳遞指針,數據就有被修改的可能。如果不希望數據被修改,就要傳遞指向整數常量的指針。使用for循環的示例如下:

for(ptr = begin; ptr != end; ptr++)

total = total +*ptr;

將ptr設置為待處理的第一個元素(begin指向的元素)的指針,并將*ptr(元素的值)加入到total中。然后循環通過遞增操作來更新ptr,使之指向下一個元素。只要ptr不等于end,這一過程將繼續下去。當ptr等于end時,它將指向范圍中的最后一個元素后面的位置,此時循環結束。其次,請注意不同的函數調用是如何指定數組中不同的范圍的。比如:

int array[] = {39, 33, 18, 64, 73, 30, 49, 51, 81};

int n = sizeof(array) / sizeof(array[0]);

int *past = array + n;

int max = iMax(array, array + n);

int max = iMax(array, array + 3);

int max = iMax(array +3, array + 8);

指針array+n指向最后一個元素后面的一個位置(數組只有n個元素,最后一個元素的地址為array+n-1),因此范圍[array,array+n]指定的是整個數組。同樣array,array+3指定了前3個元素,依此類推。注意,根據指針減法規則,表達式end–begin是一個整數值,等于數組的元素個數。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4607

    瀏覽量

    92840
  • 軟件設計
    +關注

    關注

    3

    文章

    58

    瀏覽量

    17770
  • 周立功
    +關注

    關注

    38

    文章

    130

    瀏覽量

    37616

原文標題:周立功:算法的泛化問題,你應該知道

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    立功教你C語言編程與程序設計:這樣寫函數指針數組最好用

    立功教授數年之心血之作《程序設計與數據結構》以及《面向AMetal框架與接口的編程(上)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復【編程】即可在線閱讀。
    的頭像 發表于 08-31 14:06 ?6892次閱讀
    <b class='flag-5'>周</b><b class='flag-5'>立功</b><b class='flag-5'>教你</b><b class='flag-5'>學</b>C語言編程與程序設計:這樣寫函數指針數組最好用

    基于labview立功公司的USBCAN-II型CAN卡的各種通訊子VI

    點擊學習>>《龍哥手把手教你LabVIEW視覺設計》視頻教程基于labview立功公司的USBCAN-II型CAN卡的各種通訊子VI:[hide] [/hide]
    發表于 02-23 11:16

    立功寫給單片機的年輕人 經典勵志

    立功寫給單片機的年輕人經典勵志
    發表于 08-11 18:39

    立功CANTest軟件

    立功CANTest軟件
    發表于 01-15 16:52

    立功CANTest軟件

    立功CANTest軟件
    發表于 02-27 09:26

    【微信精選】轉行or堅守,是否每個硬件工程師經歷過這樣的迷思?

    這些腿腳不好使的追不上風口,飛不起來就腳踏實地吧,行業有起伏,說不定哪天吃飽正睡呢,就被卷上天了,這個時代,太多不可能成為可能了(諾基亞,呵呵),那天之前,起碼自我修煉,把體重減輕,方便被卷。2.
    發表于 10-11 07:30

    立功寫給單片機的年輕人

    立功寫給單片機的年輕人 作為過來人思前想后,我感到完全有責任將發自心底的感受傳遞給年輕一代,一個企業家心靈深處渴望優秀人才的卓越追求和深層次的嘆息、痛苦和感受。
    發表于 05-14 16:40 ?0次下載

    立功電子從業經歷回顧一:初生牛犢不怕虎

    國內電子行業的人對立功先生相信都會有很深刻的了解,不知道你們是怎么看,反正在小便讀書的時候,我們老師總是很推崇這個技術牛人,這個開拓了一個新時代的印記。近日,立功先生在其博客上寫下
    發表于 04-17 10:53 ?9612次閱讀

    立功電子從業經歷回顧二:柳暗花明又一村

    在昨天的立功從業經歷回顧里面,我們給大家介紹了立功先生早前的求學經歷,受到大家的歡迎,接下來
    發表于 04-18 09:21 ?2666次閱讀

    嵌入式系統軟件設計中的常用算法航慈 清晰完整版)

    電子發燒友網站提供《嵌入式系統軟件設計中的常用算法航慈 清晰完整版).txt》資料免費下載
    發表于 05-27 11:04 ?0次下載

    駕駛一輛被黑客黑掉 油門和剎車失靈的車是什么體驗?

    是否經歷過在開車時剎車和油門失靈的危險狀況?也許沒有經歷過,但是這種事情一定有可能發生,而
    發表于 07-10 09:21 ?965次閱讀

    TinyM0_tools.pdf立功官方文件 教你怎么下載 很不錯

    TinyM0_tools.pdf立功官方文件 教你怎么下載 很不錯
    發表于 10-13 15:14 ?15次下載
    TinyM0_tools.pdf<b class='flag-5'>周</b><b class='flag-5'>立功</b>官方文件 <b class='flag-5'>教你</b>怎么下載 很不錯

    手把手教你LabVIEW視覺設計

    手把手教你LabVIEW視覺設計手把手教你LabVIEW視覺設計手把手教你LabVIEW視
    發表于 03-06 01:41 ?3130次閱讀

    推挽電路的沒?

    推挽電路的沒?
    的頭像 發表于 11-24 16:25 ?1112次閱讀
    推挽電路的<b class='flag-5'>坑</b>,<b class='flag-5'>你</b>踩<b class='flag-5'>過</b>沒?

    反相輸入放大器的沒有?

    反相輸入放大器的沒有?
    的頭像 發表于 12-06 15:35 ?638次閱讀
    反相輸入放大器的<b class='flag-5'>坑</b>,<b class='flag-5'>你</b>踩<b class='flag-5'>過</b>沒有?
    主站蜘蛛池模板: 最新色导航| 野花日本大全免费观看3中文版| 日本xxxxxxx| 24小时日本高清免费看| 果冻传媒在线观看网站| 亚欧视频在线观看| 国产精品999| 无码天堂亚洲内射精品课堂| 国产成人无码AV麻豆| 四虎免费影院| 国产睡熟迷奷系列精品| 亚洲XXX午休国产熟女屁| 国产线精品视频在线观看| 亚洲国产成人久久一区www妖精 | 欧洲vs美洲完整视频| 99视频一区| 日本高清天码一区在线播放| gogo亚洲肉体艺术照片9090| 青青视频 在线 在线播放| 成人网络电视破解版| 手机在线观看毛片| 国产亚洲精品欧洲在线视频| 一二三四在线高清中文版免费观看电影 | 亚洲精品久久久无码| 久久re热在线视频精69| 中文无码不卡的岛国片国产片| 美女露出撒尿的部位| 办公室激情在线观看| 偷拍久久国产视频免费| 韩国无遮羞禁动漫在线观看| 御姐被吸奶| 欧美做真爱欧免费看| 国产亚洲精品久久久999密臂| 伊人国产在线视频| 欧美人与动交zOZ0| 国产女人91精品嗷嗷嗷嗷| 影音先锋影院中文无码| 欧美午夜a级精美理论片| 国产精品亚洲精品日韩电影| 野花视频在线观看免费| 泡妞高手在都市完整版视频免费|