国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

順序查找概念:從表的另一端開始,一次將記錄的關(guān)鍵字和給定值進(jìn)行比較,若某個(gè)記錄的關(guān)鍵字和給定的值相等,則查找成功,反之則查找失敗。

ASL:平均查找長(zhǎng)度

pi查找概率,ci查找次數(shù)

數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

eg:序列1,2,3

查找1的次數(shù)為1概率為1/3,2為兩次概率1/3,3的次數(shù)為3概率1/3?

將123的查找率*查找次數(shù)的結(jié)果累加得到?平均查找次數(shù)

數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))?

順序查找的代碼實(shí)現(xiàn):(這里我么用的順序表查找)?

//順序查找
typedef struct List
{
	int* data;//數(shù)據(jù)元素
	int* length;//數(shù)據(jù)長(zhǎng)度
	int size;//有效數(shù)據(jù)個(gè)數(shù)
}List;

List* initList(int length)
{
	List* list = (List*)malloc(sizeof(List));
	list->length = length;
	list->data = (int*)malloc(sizeof(int) * length);
	list->size = 1;//size等于1的時(shí)候說明帶有哨兵,后面的數(shù)據(jù)從第二個(gè)位置開始存元素。
	return list;
}

void listAdd(List* list,int data)
{
	if (list->size == list->length)//所存儲(chǔ)的有效數(shù)據(jù)已經(jīng)等于空間大?。臻g已經(jīng)滿了)
{//這里我們重新定義一個(gè)newlength,防止開始length為0時(shí),length*2=0;
	int newlength = list->length == 0 ? 4 : list->length * 2;
	int* tmp = (List*)realloc(list->data, newlength * sizeof(int));
	if (tmp == NULL)
	{
		printf("空間開辟失敗\n");
		exit(-1);
	}
	else
	{
		list->data[list->size] = data;
		list->size++;
	}
	}
	else
	{
		list->data[list->size] = data;
		list->size++;
	}
}

void printlist(List* list)
{

	for ( int i = 0;  i <list->size ; i++)
	{
		printf("%d ->", list->data[i]);
	}
	printf("NULL\n");
}

int search(List* list, int key)
{
	int i=0;
	list->data[0] = key;
 //for循環(huán)后面沒有語句只有分號(hào)時(shí),當(dāng)不滿足for循環(huán)的條件后循環(huán)結(jié)束不再進(jìn)行,直接進(jìn)行下一語句。
	for (i = (list->size) - 1; list->data[i] != key; i--);//for循環(huán)后面沒有語句的執(zhí)行的時(shí)候需要添加分號(hào),防止后面的語句直接進(jìn)入for循環(huán)中。
	return i;//如果返回的為0則認(rèn)為沒有查找到,因?yàn)槲覀儼岩檎业脑胤旁诹祟^節(jié)點(diǎn)當(dāng)中。
}

int main()
{
	List* list = initList(5);
	listAdd(list, 1);
	listAdd(list, 2);
	listAdd(list, 3);
	listAdd(list, 4);
	listAdd(list, 5);
	printlist(list);
	printf("%d\n", search(list, 3));
	return 0;
}

順序查找的ASL:第一個(gè)節(jié)點(diǎn)需要1次,第n個(gè)節(jié)點(diǎn)則需要n次

則總該查找的次數(shù)為Sn=n*(n+1)/2(等差數(shù)列求和公式)

每次查找的概率為1/n

所以順序查找的ASL為:n*(n+1)/2*(1/n)=(n+1)/2?

所以時(shí)間復(fù)雜度為O(n)。

二分查找L(折半查找):

前提條件是有序序列,即每次從序列的中間開始于所要查找的元素比較,如果中間元素小于key(要查找的元素)則從中間元素的右邊查找(以中間元素+1為首元素,尾元素不變,再去求mid于key相比)。同理若key<mid則要從mid的左邊尋找(以中間元素-1為尾元素,首元素素不變,在去求mid于key比較),若key等于mid則返回。

代碼實(shí)現(xiàn):利用循環(huán)查找

//循環(huán)查找
int binarysearch(int key,List* list)
{
	int start = 0;
	int end = list->size - 1;
	int mid = 0;
	while (start<=end)/如果我們的首元素下標(biāo)大于尾元素下標(biāo)則說明我們已經(jīng)遍歷完整個(gè)序列不存在要找的元素
	{
		mid = (start + end) / 2;
		if (list->data[mid] < key)
		{
			start = mid + 1;
		}
		else if (list->data[mid]>key)
		{
			end = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;//-1表示不存在
}

遞歸實(shí)現(xiàn)二分查找:

//遞歸查找   1.分半2查找(左查/右查)。
int binarysearchRecursion(int key, List* list, int start, int end)
{
	//出口
	if (start == end)//每個(gè)遞歸都有一個(gè)終止條件相當(dāng)于我們while中的start<=end,當(dāng)兩個(gè)下標(biāo)相等時(shí)進(jìn)行判斷如果等于key則返回任意一個(gè)下標(biāo),如果不相等則說明沒有找到
	{
		if (list->data[start]==key)
		{
			return start;
		}
		else
		{
			return -1;
		}
	}
	int mid = (start + end) / 2;
//每次查找不到進(jìn)行遞歸,看key于mid的比較來判斷如果縮小范圍	
if (list->data[mid] < key)
	{
	return	binarysearchRecursion(key, list, mid+1, end);
	}
	else if (list->data[mid]>key)
	{
	return	binarysearchRecursion(key, list, start, mid - 1);
	}
	else
	{
		return mid;
	}
}

?二分查找的時(shí)間復(fù)雜度:(兩個(gè)二分查找的世家復(fù)雜度相同所以我們只講解一個(gè)即可)

我們可以把線性表堪稱一顆樹(因?yàn)榫€性表是有序的比key小的都在其坐標(biāo),比它大的都在其右邊)

eg:

數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

?樹的查找:節(jié)點(diǎn)在第幾層需要查找?guī)状危琱層需要查找h次(所有的算法都符合此條件)

假設(shè)有n個(gè)節(jié)點(diǎn),h層==》由樹的公式得到n=2^(h-1)? ?一棵滿二叉樹。

滿二叉樹:每一層有2^(h-1)個(gè)節(jié)點(diǎn)

每一層查找次數(shù):節(jié)點(diǎn)個(gè)數(shù)*層數(shù)==2^(h-1)*h

每層的ASL:查找次數(shù) *概率=1/n*2^(h-1)*h

分解求2^(h-1)*h如何用n來代替

觀察得此為等差*等比數(shù)列,求法(錯(cuò)位相減Sn-hSn)

數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

3,4式聯(lián)立:?

數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))?

?數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

?文章來源地址http://www.zghlxwxcb.cn/news/detail-459403.html

再去×1/n得到整個(gè)順序的ASL?

數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

?再利用我們數(shù)學(xué)極限n趨向足夠大的時(shí)候前面的分式可以約掉,所以結(jié)果

約等于:兩個(gè)都可

數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))

?

順序查找于二分查找以簡(jiǎn)略的講完,一些圖片資料與代碼都借鑒于b站upTyrantLucifer

?

?

?

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)-查找(順序查找與二分查找的講解與代碼實(shí)現(xiàn))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java【數(shù)據(jù)結(jié)構(gòu)】二分查找

    Java【數(shù)據(jù)結(jié)構(gòu)】二分查找

    ??在 有序 數(shù)組A中,查找目標(biāo)值target ??如果找到返回索引 ??如果找不到返回-1 算法描述 解釋 前提 給定一個(gè)內(nèi)含n個(gè)元素的有序數(shù)組A,滿足A0=A1=A2=·······=An-1,一個(gè)待查值target 1 設(shè)置left=0;right = n - 1 2 如果left right ,結(jié)束查找,沒找到 3 設(shè)置mid = (left + right )/2,mid為中間

    2024年02月12日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)進(jìn)階篇 之 【二叉樹順序存儲(chǔ)(堆)】的整體實(shí)現(xiàn)講解(賦完整實(shí)現(xiàn)代碼)

    數(shù)據(jù)結(jié)構(gòu)進(jìn)階篇 之 【二叉樹順序存儲(chǔ)(堆)】的整體實(shí)現(xiàn)講解(賦完整實(shí)現(xiàn)代碼)

    做人要謙虛,多聽聽別人的意見,然后記錄下來,看看誰對(duì)你有意見 3.1 向下調(diào)整算法 AdJustDown 3.2 向上調(diào)整算法 AdJustUP 3.3 堆的創(chuàng)建 3.3.1 向上建堆 3.3.2 向下建堆 3.3.3 堆的初始化與銷毀 3.3.4 堆的插入(壓棧) 3.3.5 取堆頂?shù)臄?shù)據(jù) 3.3.6 堆的刪除 3.3.7 堆的數(shù)據(jù)個(gè)數(shù) 3.3.8 堆的判空

    2024年04月17日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu),查找算法(二分,分塊,哈希)

    一、查找算法 ? ? ? ? 1、二分查找:(前提條件: 必須有序的序列) 2、分塊查找:(塊間有序,塊內(nèi)無序) ? ? 索引表 ?+ ?源數(shù)據(jù)表 ? ? 思路: ? ? (1)先在索引表中確定在哪一塊中 ? ? (2)再遍歷這一塊進(jìn)行查找 //索引表 typedef ?struct? { ?? ?int max; //塊中最大值

    2024年02月11日
    瀏覽(27)
  • Java數(shù)據(jù)結(jié)構(gòu)與算法:查找算法之二分查找

    大家好,我是免費(fèi)搭建查券返利機(jī)器人賺傭金就用微賺淘客系統(tǒng)3.0的小編,歡迎回到本專欄。在這個(gè)冰冷的季節(jié)里,我們將一同探討Java中一種高效的查找算法——二分查找。讓我們點(diǎn)燃知識(shí)的火花,一同解鎖這個(gè)查找奇跡的秘密! 二分查找簡(jiǎn)介 二分查找,也稱為折半查找,

    2024年01月21日
    瀏覽(39)
  • 【手撕數(shù)據(jù)結(jié)構(gòu)】二分查找(好多細(xì)節(jié))

    ??鍵盤敲爛,年薪30萬?? 目錄 普通版本的二分查找: right只負(fù)責(zé)控制邊界(少了兩次比較): 時(shí)間復(fù)雜度更穩(wěn)定的版本: BSLeftmost: BSRightmost: ? ??細(xì)節(jié)1:循環(huán)判定條件是left = right ?細(xì)節(jié)2:mid = (left + right ) 1 原因見代碼注釋 改動(dòng)1:while條件是left right 改動(dòng)2:right = nums.len

    2024年02月05日
    瀏覽(28)
  • Python數(shù)據(jù)結(jié)構(gòu)與算法篇(五)-- 二分查找與二分答案

    Python數(shù)據(jù)結(jié)構(gòu)與算法篇(五)-- 二分查找與二分答案

    1.1 定義 ????????二分查找又稱折半查找、二分搜索、折半搜索等,是一種在靜態(tài)查找表中查找特定元素的算法。 ????????所謂靜態(tài)查找表,即只能對(duì)表內(nèi)的元素做查找和讀取操作,不允許插入或刪除元素。 ????????使用二分查找算法,必須保證查找表中存放的是有

    2023年04月20日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】python實(shí)現(xiàn)二分查找

    【數(shù)據(jù)結(jié)構(gòu)與算法】python實(shí)現(xiàn)二分查找

    二分查找 又稱折半查找,它是一種效率較高的查找方法 原理:首先,假設(shè)表中元素是按升序排列,將表中間位置記錄的與查找比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個(gè)子表,如果中間位置記錄的大于查找,則

    2024年02月05日
    瀏覽(32)
  • 數(shù)據(jù)結(jié)構(gòu)和算法之二分法查找

    二分法查找,也稱作 二分查找 或 折半查找 ,是一種在有序數(shù)組中快速查找特定元素的算法。它采用分治法思想,通過將問題劃分為規(guī)模更小的子問題,并且通過對(duì)子問題的查找來解決原問題。 二分法查找的思路是不斷地將數(shù)組一分為二,然后判斷目標(biāo)值在哪一部分,進(jìn)而

    2024年02月09日
    瀏覽(31)
  • 數(shù)據(jù)結(jié)構(gòu)之順序查找

    ? 活動(dòng)地址:CSDN21天學(xué)習(xí)挑戰(zhàn)賽 目錄 數(shù)據(jù)結(jié)構(gòu)概念: 算法效率: 1)時(shí)間復(fù)雜度 2)空間復(fù)雜度 順序查找: 代碼實(shí)現(xiàn):? ??作者簡(jiǎn)介:大家好我是小唐同學(xué)(???),大家可以叫我小唐 個(gè)人主頁: 小唐同學(xué)(???)的博客主頁 系列專欄:數(shù)據(jù)結(jié)構(gòu) 博友們?nèi)绻彩切率秩?/p>

    2024年02月13日
    瀏覽(23)
  • 浙大數(shù)據(jù)結(jié)構(gòu)第一周01-復(fù)雜度3 二分查找

    本題要求實(shí)現(xiàn)二分查找算法。 函數(shù)接口定義: 其中 List 結(jié)構(gòu)定義如下: L 是用戶傳入的一個(gè)線性表,其中 ElementType 元素可以通過、==、進(jìn)行比較,并且題目保證傳入的數(shù)據(jù)是遞增有序的。函數(shù) BinarySearch 要查找 X 在 Data 中的位置,即數(shù)組下標(biāo)(注意:元素從下標(biāo)1開始存儲(chǔ))

    2024年02月12日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包