1. 程式人生 > >搜尋:線性搜尋、二分搜尋、雜湊搜尋(雜湊還未完成)

搜尋:線性搜尋、二分搜尋、雜湊搜尋(雜湊還未完成)

題目:

請編寫一個程式,輸入包含n個整數的數列A以及包含q個不重複整數數列T,請輸出A和T的交集元素的個數

一、線性搜尋

#include "pch.h"
#include <stdio.h>

int search(int A[], int n, int key) {
	int i = 0;
	A[n] = key;//注意這一步:新增標記,相當於設定尋找到位置
	while (A[i] != key) {
		i++;
	}
	return i != n;//i==n說明沒找到,i!=n說明找到了
}

int main()
{
	int i, n, A[10000 + 1], q, key, sum = 0;
	scanf_s("%d", &n);
	for (i = 0; i < n; i++) {
		scanf_s("%d", &A[i]);
	}
	scanf_s("%d", &q);
	for (i = 0; i < q; i++) {
		scanf_s("%d", &key);
		if (search(A, n, key)) {
			sum++;
		}
	}
	printf("%d\n", sum);
	return 0;
}

二、二分搜尋

1、待搜尋序列需要有序:升序、降序

2、三個指標:left、right、mid = (left+right)/2

  • 將mid所指的元素A[mid]與key進行比較,一致則返回mid
  • 若key<A[mid]:則right = mid —> mid= (left+right)/2,更新mid,搜尋範圍縮小後半部分

演算法複雜度:O(logn)

#include "pch.h"
#include <iostream>
#include<stdio.h>

int A[1000000], n;

int binarySearch(int key) {
	int left = 0;
	int right = n;
	int mid;
	while (left < right) {
		mid = (left + right) / 2;
		if (key == A[mid]) {
			return 1;
		}
		if (key > A[mid]) {
			left = mid + 1;
		}
		else {
			right = mid;
		}
	}
	return 0;
}

int main()
{
	int i, q, k, sum = 0;
	scanf_s("%d", &n);
	for (i = 0; i < n; i++) {
		scanf_s("%d", &A[i]);
	}
	scanf_s("%d", &q);
	for (i = 0; i < q; i++) {
		scanf_s("%d", &k);
		if (binarySearch(k)) {
			sum++;
		}
	}
	printf("%d\n", sum);
	return 0;
}

三、雜湊法

題目:實現字典,可向字典中新增字串,也可查詢字串是否在字典中

雜湊法:根據各個元素的值來確定儲存位置,然後將位置保管在散列表中。