数据结构与算法JavaScript描述练习------第13章检索算法

1. 顺序查找算法总是查找数据集中匹配到的第一个元素。请重写该算法使之返回匹配到的 最后一个元素。

function seqSearchLast(arr, data) {
	var lastIndex = -1;
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] == data) {
			lastIndex = i;
		}
	}
	return lastIndex;
}


function dispArr(arr) { 
	for (var i = 0; i < arr.length; ++i) { 
		console.log(arr[i] + " "); 
		if (i % 10 == 9) { 
			console.log("\n"); 
		} 
	} 
	if (i % 10 != 0) { 
		console.log("\n"); 
	} 
} 
 
var nums = []; 
for (var i = 0; i < 10; ++i) { 
	nums[i] = Math.floor(Math.random() * 11); 
} 
dispArr(nums); 
var readline = prompt("输入一个要查找的数字:");
var num = parseInt(readline);
var lastIndex = seqSearchLast(nums, num);
if (lastIndex !== -1) {
    console.log(num + " 最后出现在数组中的位置是:" + lastIndex);
} else {
    console.log(num + " 没有出现在这个数组中。");
}

2. 对同一个数据集进行测试,比较顺序查找算法执行所花费的时间与同时使用插入排序算 法和二分查找算法花费的总时间。你得到的结果是什么?


function seqSearch(arr, data) { 
	for (var i = 0; i < arr.length; ++i) { 
		if (arr[i] == data) { 
			return i; 
		} 
	} 
	return -1; 
}

function findMin(arr) { 
	var min = arr[0]; 
	for (var i = 1; i < arr.length; ++i) { 
		if (arr[i] < min) { 
			min = arr[i]; 
		} 
	} 
	return min; 
}

function findMax(arr) { 
	var max = arr[0]; 
	for (var i = 1; i < arr.length; ++i) { 
		if (arr[i] > max) { 
			max = arr[i]; 
		} 
	} 
	return max; 
}

function swap(arr, index, index1) { 
	temp = arr[index]; 
	arr[index] = arr[index1];
	arr[index1] = temp; 
}

function seqSearch1(arr, data) { 
	for (var i = 0; i < arr.length; ++i) { 
		if (arr[i] == data && i > (arr.length * 0.2)) { 
			swap(arr, i, 0); 
			return true; 
		} else if (arr[i] == data) {
			return true;
		}
	} 
	return false; 
}

function insertionsort(arr) { 
	var temp, inner; 
	for (var outer = 1; outer <= arr.length-1; ++outer) { 
		temp = arr[outer];
		inner = outer; 
		while (inner > 0 && (arr[inner-1] >= temp)) { 
			arr[inner] = arr[inner-1]; 
			--inner; 
		} 
		arr[inner] = temp; 
	} 
} 

function binSearch(arr, data) { 
	var upperBound = arr.length-1; 
	var lowerBound = 0; 
	while (lowerBound <= upperBound) { 
		var mid = Math.floor((upperBound + lowerBound) / 2); 
		if (arr[mid] < data) { 
			lowerBound = mid + 1; 	
		} else if (arr[mid] > data) { 
			upperBound = mid - 1; 
		} else { 
			return mid; 
		} 
	} 
	return -1; 
} 

function count(arr, data) { 
	var count = 0; 
	var position = binSearch(arr, data); 
	if (position > -1) { 
		++count; 
		for (var i = position-1; i > 0; --i) { 
			if (arr[i] == data) { 
				++count; 
			} else { 
				break; 
			} 
		} 
		for (var i = position+1; i < arr.length; ++i) { 
			if (arr[i] == data) { 
				++count; 
			} else { 
				break; 
			} 
		} 
	} 
	return count; 
}



function generateRandomArray(size, maxVal) {
    let arr = [];
    for (let i = 0; i < size; ++i) {
        arr.push(Math.floor(Math.random() * maxVal));
    }
    return arr;
}
function testSequentialSearch(arr, data) {
    let startTime = performance.now();
    seqSearch(arr, data);
    let endTime = performance.now();
    return endTime - startTime;
}
function testInsertionSortAndBinarySearch(arr, data) {
    let startTime = performance.now();
    insertionsort(arr);
    let sortTime = performance.now() - startTime;

    startTime = performance.now();
    binSearch(arr, data);
    let searchTime = performance.now() - startTime;

    return sortTime + searchTime;
}
function main() {
    const size = 10000; 
    const maxVal = 100000; 
    const data = Math.floor(Math.random() * maxVal); 

    let arr = generateRandomArray(size, maxVal);

    console.log("Sequential Search Time:", testSequentialSearch(arr.slice(), data), "ms");
    console.log("Insertion Sort + Binary Search Time:", testInsertionSortAndBinarySearch(arr.slice(), data), "ms");
}

main();

//Sequential Search Time: 0.4 ms
//Insertion Sort + Binary Search Time: 26.4ms

3. 创建一个函数用来查找数据集中的次小元素。你能否归纳一下,如何实现查找第三小、 第四小,等等的搜索函数?在至少有 1000 个元素的数据集上测试你的函数。请同时在 数字和文本数据集上进行测试。


function seqSearch(arr, data) { 
	for (var i = 0; i < arr.length; ++i) { 
		if (arr[i] == data) { 
			return i; 
		} 
	} 
	return -1; 
}

function findMin(arr) { 
	var min = arr[0]; 
	for (var i = 1; i < arr.length; ++i) { 
		if (arr[i] < min) { 
			min = arr[i]; 
		} 
	} 
	return min; 
}

function findMax(arr) { 
	var max = arr[0]; 
	for (var i = 1; i < arr.length; ++i) { 
		if (arr[i] > max) { 
			max = arr[i]; 
		} 
	} 
	return max; 
}

function swap(arr, index, index1) { 
	temp = arr[index]; 
	arr[index] = arr[index1];
	arr[index1] = temp; 
}

function seqSearch1(arr, data) { 
	for (var i = 0; i < arr.length; ++i) { 
		if (arr[i] == data && i > (arr.length * 0.2)) { 
			swap(arr, i, 0); 
			return true; 
		} else if (arr[i] == data) {
			return true;
		}
	} 
	return false; 
}

function insertionsort(arr) { 
	var temp, inner; 
	for (var outer = 1; outer <= arr.length-1; ++outer) { 
		temp = arr[outer];
		inner = outer; 
		while (inner > 0 && (arr[inner-1] >= temp)) { 
			arr[inner] = arr[inner-1]; 
			--inner; 
		} 
		arr[inner] = temp; 
	} 
} 

function binSearch(arr, data) { 
	var upperBound = arr.length-1; 
	var lowerBound = 0; 
	while (lowerBound <= upperBound) { 
		var mid = Math.floor((upperBound + lowerBound) / 2); 
		if (arr[mid] < data) { 
			lowerBound = mid + 1; 	
		} else if (arr[mid] > data) { 
			upperBound = mid - 1; 
		} else { 
			return mid; 
		} 
	} 
	return -1; 
} 

function count(arr, data) { 
	var count = 0; 
	var position = binSearch(arr, data); 
	if (position > -1) { 
		++count; 
		for (var i = position-1; i > 0; --i) { 
			if (arr[i] == data) { 
				++count; 
			} else { 
				break; 
			} 
		} 
		for (var i = position+1; i < arr.length; ++i) { 
			if (arr[i] == data) { 
				++count; 
			} else { 
				break; 
			} 
		} 
	} 
	return count; 
}



function ensureAllStrings(arr) {
    return arr.map(item => String(item));
}

function findSecondSmallest(arr) {
    if (arr.length < 2) {
        throw new Error('Array must have at least two elements');
    }

    const uniqueElements = Array.from(new Set(arr));
    if (uniqueElements.length < 2) {
        throw new Error('Array must have at least two unique elements');
    }

    const sortedUniqueElements = ensureAllStrings(uniqueElements).sort((a, b) => a.localeCompare(b));

    return sortedUniqueElements[1];
}

function findKthSmallest(arr, k) {
    if (k < 1 || k > arr.length) {
        throw new Error('Invalid k value');
    }

    const uniqueElements = Array.from(new Set(arr));
    if (k > uniqueElements.length) {
        throw new Error('k is larger than the number of unique elements');
    }

    const sortedUniqueElements = ensureAllStrings(uniqueElements).sort((a, b) => a.localeCompare(b));

    return sortedUniqueElements[k - 1];
}

function filterEmptyStrings(arr) {
    return arr.filter(str => str !== '');
}




function generateRandomArray(size, maxVal) { 
	var arr = []; 
	for (var i = 0; i < size; ++i) { 
		arr.push(Math.floor(Math.random() * maxVal)); 
	} 
	return arr; 
}

function testFindKthSmallest() {
    var size = 1000;
    var maxVal = 10000;
    var arr = generateRandomArray(size, maxVal);

    console.log("Generated array:", arr);
    console.log("Second smallest element:", findSecondSmallest(arr));
    console.log("Third smallest element:", findKthSmallest(arr, 3));
    console.log("Fourth smallest element:", findKthSmallest(arr, 4));
}

testFindKthSmallest();


function generateRandomTextArray(size, maxLength) { 
	var arr = []; 
	var characters = 'abcdefghijklmnopqrstuvwxyz'; 
	for (var i = 0; i < size; ++i) { 
		var text = ''; 
		for (var j = 0; j < Math.floor(Math.random() * maxLength); ++j) { 
			text += characters[Math.floor(Math.random() * characters.length)]; 
		} 
		arr.push(text); 
	} 
	return arr; 
}

function testFindKthSmallestText() {
    var size = 1000;
    var maxLength = 10;
    var arr = generateRandomTextArray(size, maxLength);

    console.log("Generated text array:", arr);
	var filteredArr = filterEmptyStrings(arr);
    console.log("Second smallest element:", findSecondSmallest(filteredArr));
    console.log("Third smallest element:", findKthSmallest(filteredArr, 3));
    console.log("Fourth smallest element:", findKthSmallest(filteredArr, 4));
}

testFindKthSmallestText();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值