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

news2024/10/17 14:08:46

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();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2217103.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

医护人员排班|基于springBoot的医护人员排班系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息…

js 对网页表格内容进行全选

起因&#xff0c; 目的: 需要从一个数据库&#xff0c;手动选取数据&#xff0c;而且这个网页没有全选按钮&#xff0c;只能一个一个点&#xff0c;很烦。 所以写了一个简单的 js 脚本&#xff0c; 一键全选。 过程: 代码 1 function clickAllBoxes() {const checkboxes do…

HarmonyNext保存Base64文件到Download下

本文介绍如何保存Base64的文件到Download下 参考文档地址&#xff1a; 保存用户文件-Harmony Next 用到的是DOWNLOAD模式保存文件 用户在使用save接口时&#xff0c;可以将pickerMode配置为DOWNLOAD模式&#xff0c;该模式下会拉起授权接口&#xff0c;用户确认后会在公共路径…

ChatGPT丨R语言在生态环境数据统计分析、绘图、模型中的应用

第一单元&#xff1a;生态环境数据统计概述 1.1 生态环境数据特点及统计方法介绍 1&#xff0e;生态环境数据复杂性和多样性 2&#xff0e;生态环境数据类型及分布特点 3&#xff0e;生态环境数据主要统计分析方法及统计检验&#xff08;t-检验、F检验、卡方检验&#xff0…

PostgreSQL Windows系统初始化、登录、创建用户及数据库

文章目录 PostgreSQL初始化PostgreSQL登录 PostgreSQL初始化 initdb 到安装目录下&#xff0c;找到目录E:\postgresql\bin&#xff08;自己的安装目录&#xff09;&#xff0c;在该目录下使用管理员方式打开cmd窗口。 initdb.exe -D "E:\postgresql\bin" E:\postgre…

车载软件架构---软件定义汽车的复杂性

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

闹钟、绘制与TCP

闹钟 pro文件&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimer> #include<QTime> #include<QDebug> #include<QTimerEvent> #include<QDateTime> #include<QTextToSpeech> #i…

sql-labs靶场第十五关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库&#xff0c;查看数据库名称 ③爆表&#xff0c;查看security库的所有表 ④爆列&#xff0c;查看users表的所有列 ⑤成功获取用户名…

65.DDR3读写控制器的设计与验证(2)

&#xff08;1&#xff09;写FIFO和读FIFO的配置 &#xff08;2&#xff09;AXI接口写入控制代码&#xff1a; module axi_master_write (//全局变量input wire ACLK , //全局时钟input wire ARESETN , …

AI工具推荐合集

在数字化时代&#xff0c;AI工具的出现极大地改变了我们的工作和生活方式。无论是学术研究、创意设计还是日常写作&#xff0c;这些工具都能提供强大的支持。以下是一些值得推荐的AI工具&#xff0c;帮助您提高效率与创造力。 1. 包阅AI 官网链接: 包阅AI 包阅AI是一款智能A…

哪吒汽车的工资到底发没发?

联网圈第一预言家&#xff0c;也就是美团的王兴&#xff0c;早在新能源热钱最多的那几年就预言&#xff0c;未来中国汽车格局大概率是「3333」。 也就是3家央企、3家地方国企、3家民企和3家新势力…… 此言论一出&#xff0c;当时可以说惹急了很多车企&#xff0c;比如已经退…

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题&#xff08;180&#xff09; Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

ARINC 429总线协议

一、概述 ARINC 是美国航空无线电公司英文字头的缩写&#xff0c; 该公司1977年7月21日出版了“ARINC 429规范”一书&#xff0c;429规范就是飞机电子系统之间数字式数据传输的标准格式&#xff0c;在飞机上使用429总线的电子设备均应遵守这个规范&#xff0c;这样才能保证电子…

Debug-029-el-table实现自动滚动分批请求数据

前情提要 最近做了一个小优化&#xff0c;还是关于展示大屏方面的。大屏中使用el-table展示列表数据&#xff0c;最初的方案是将数据全部返回&#xff0c;确实随着数据变多有性能问题&#xff0c;有时请求时间比较长。这里做的优化就是实现列表的滚动到距离底部一定高度时再次请…

如何处理多频段时序特征?这个Transformer变体显著提升预测效果

Transformer 模型已在时间序列预测中展现了卓越的性能。然而&#xff0c;在一些复杂场景中&#xff0c;它倾向于学习数据中的低频特征&#xff0c;而忽略了高频特征&#xff0c;表现出一种频率偏差。这种偏差阻碍了模型准确捕捉重要的高频数据特征。 本文介绍一篇来自 KDD 202…

菜鸟笔记006 截图识别文字插件 textOCR

随手可得的截图识别文字插件 textOCR&#xff0c;识别出来的文字可直接输入到illustrator的当前文档中&#xff1a; 执行条件 1、需截图软件支持&#xff0c;推荐笔记截图工具 2、截好图片直接拖入面板即可完成识别 ****后期可完成实现在illustrator选择图片对象完成文字识别。…

Docker-Harbor概述及构建

文章目录 一、Docker Harbor概述1.Harbor的特性2.Harbor的构成 二、搭建本地私有仓库三、部署 Docker-Harbor 服务四、在其他客户端上传镜像五、维护管理Harbor 一、Docker Harbor概述 Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅…

方波信号发生器(完整SCL源代码)

正弦和余弦信号发生器请参考下面文章链接: 1、博途PLC平台 PLC信号发生器(博途SCL)_博图软件波形发生器怎么用-CSDN博客文章浏览阅读1.1k次。本文介绍了如何使用博途SCL编程实现不同周期和幅值的信号发生器,包括余弦和正弦信号。通过信号发生器,可以用于验证PLC的滤波器效…

cesium模型加载

注意cesium版本&#xff1a; "three": "^0.168.0", 代码&#xff1a; <template><Layout :bg-color"black"><template #content><div id"cesiumContainers"><div id"cesiumContainer" class&q…

【C++】——二叉搜索树

目录 一、前言 二、二叉搜索树 2.1概念 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 打印 2.3.5 拷贝构造和赋值重载 2.3.6 析构函数 2.4 二叉搜索…