二分应用的小坑———折半查找

2024-03-09 19:20

本文主要是介绍二分应用的小坑———折半查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

啊!啊!啊!啊!啊!!!

TLE越界了

太久没有写代码了

虽热很久没有写代码和博客了,但是功底还是在的
今天打算写一点数据结构的排序部分一点一点落实下来,但是
写着写着卡壳了,以下是没有debug的代码

#include <iostream>
#include<bits/stdc++.h>using namespace std;
vector<int> a;int check(int l, int r, int x) {while (l < r) {int mid = (l + r + 1) >> 1;if (a[mid] > x) {r = mid - 1;} else {l = mid;}}return r;
}void mid_insert_sort() {for (int i = 1; i < a.size(); i++) {int x = check(0, i, a[i]);cout << x << ' ' << i << endl;for (int j = i; j > x; j--) {swap(a[j], a[j - 1]);}for (int j = 0; j < a.size(); j++) {cout << a[j] << ' ';}cout << endl;}
}int main() {int n;cin >> n;while (n--) {int x;cin >> x;a.push_back(x);}mid_insert_sort();for (int i: a)cout << i << ' ';
}

反正二分和折半插入的思想没有错
然后开始慢慢检查二分check函数的错误
1.check函数用的bool函数写的
然后返回值都是01,,,,,
以后尽量不用bool类型了,妈的
找完了之后
debug好久硬是没有错误

然后挑了一个例子debug发现每一次

10
49 59 88 37 98 97 68 54 31 31 1
49 59 88 37 98 97 68 54 31 3 
2 2
49 59 88 37 98 97 68 54 31 3 
0 3
37 49 59 88 98 97 68 54 31 3 
4 4
37 49 59 88 98 97 68 54 31 3 
3 5
37 49 59 97 88 98 68 54 31 3 
2 6
37 49 68 59 97 88 98 54 31 3 
1 7
37 54 49 68 59 97 88 98 31 3 
0 8
31 37 54 49 68 59 97 88 98 3 
0 9
3 31 37 54 49 68 59 97 88 98 
3 31 37 54 49 68 59 97 88 98 

发现了一个问题

当x大于当前队伍的所有值时,还是会交换x
然后我就特判了一下,发现还是错误,于是我就单独的把check函数拉出来检查一下,发现一个大问题,二分的范围是有限的
就比如这题: 1-5,我的check函数是找到小于等于x的最大值
我发现如果所有值都小于x那么函数return就会返回1
但是这是错误的
然会我就发现,,,,,二分是在当前的范围内进行查找,,,,
但是插入在范围中会比原来的范围多两个边界值
所以,,,,,加上a[0]就可以了,,,,,

#include <iostream>
#include<bits/stdc++.h>using namespace std;
const int N = 1e5 + 100;
int a[N];
int n;int check(int l, int r, int x) {while (l < r) {int mid = (l + r + 1) >> 1;if (a[mid] > x) {r = mid - 1;} else {l = mid;}}return r;
}void mid_insert_sort() {for (int i = 1; i <= n; i++) {int x = check(0, i, a[i]);int idx = i;for (int j = i; j - 1 > x; --j) {swap(a[j], a[j - 1]);}}}int main() {a[0] = INT32_MAX;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];}mid_insert_sort();for (int i = 1; i <= n; i++)cout << a[i] << ' ';
}

~~大意了,,,,这么个简单的代码和思想
,,,,之前一直以为哨兵是没有用的
在这里插入图片描述

主要是之前的习惯比较好,会特意注意边界问题,一般不会越界,
但是这个插入的会在边界值多出,,,,所以没有想到~~

这篇关于二分应用的小坑———折半查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/791709

相关文章

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图