using System;
namespace MinABS
{
class Program
{
static void Main(string[] args)
{
int n = 100;
int[] a = new int[n];
Random rand = new Random();
int min = int.MaxValue;
int max = int.MinValue;
Console.WriteLine("产生了" + n + "个数据的实验数组,");
for (int i = 0; i < n; i++)
{
//赋值并且取到最大最小值
//a[i] = rand.Next(int.MinValue, int.MaxValue);
a[i] = rand.Next(-100, 100);
if (a[i] < min) { min = a[i]; }
if (a[i] > max) { max = a[i]; }
Console.Write(a[i] + " ");
}
Console.WriteLine();
Console.WriteLine("在O(n)内得到最大最小分别是:");
Console.WriteLine(max + "和" + min);
long offset = (long)max + Math.Abs((long)min);
//规划数组的长度。每个byte有8位长
int len = (int)(offset >> 3) +1 ;
Byte[] B = new Byte[len];
int kkkk = 0;
bool IsSame = false;//是否有重合点标记
//O(n)的时间内分配到了Byte[]中。
for (int i = 0; i < n; i++)
{
offset = (long)a[i] - (long)min;
int index = (int)(offset >> 3);
int temp = B[index];
//把末k位变成1
//把右数第k位变成1 例如:(00101001->00101101,k=3) x | (1 << (k-1))
int tempOffSet = (1 << ( (int)(offset & 7) ) );
//判断重合
if (!IsSame)
{
kkkk = temp & tempOffSet;
if ((temp & tempOffSet) >= 1)
{
IsSame = true;
//如果0算最小距离就在这里退出吧。本代码判断重合,但没把0作为结果。
}
}
int bbb = B[index];
B[index] |= (Byte)(tempOffSet);
int aaa = B[index];
}
//最小距离初始为最大。
Console.WriteLine("在O(n)的时间内分配到了Byte[]中,正在计算最小距离,请稍候。。。。。");
long minABS = long.MaxValue;
long lastIndex = -1;
//在常数范围内循环,复杂度不增加。最坏的情况是32*int.MaxValue次。
for (int i = 0; i < B.Length; i++)
{
//if (B[i] == 0) { continue; }
//在常数范围内循环,复杂度不增加。
for (int k = 0; k < 8; k++)
{
if (((B[i] >> k) & 1) == 1)
{
if (lastIndex >= 0)
{
long temp = ((long)i << 3) + k - lastIndex;
if (temp < minABS)
{
minABS = temp;
Console.WriteLine("目前得到了最小距离:" + minABS);
}
}
lastIndex = (i << 3) + k;
}
}
}
if (IsSame)
{ Console.WriteLine("有重合点"); }
else
{ Console.WriteLine("无重合点"); }
Console.WriteLine("不考虑重合最小距离是:" + minABS);
Console.WriteLine("总复杂度是:O(n)");
Console.ReadLine();
}
}
}
分享到:
相关推荐
题目要求给定一个整数数组,计算并返回数组中任意两个元素之差的最大值。 #### 解决方案 为了找到数组中任意两个元素之差的最大值,可以采用排序的方法。首先对数组进行排序,然后计算排序后数组中最大值与最小值...
本问题来源于一个简单的数学游戏,旨在通过在给定的一系列整数间插入不同的算术运算符(加、减、乘、除)来构造一个表达式,使得该表达式的计算结果最大,同时还需要满足一个额外的条件——最终结果不能包含某个特定...
给定2到15个不同的正整数,你的任务是计算这些数里面有多少个数对满足:数对中一个数是另一个数的两倍。 比如给定1 4 3 2 9 7 18 22,得到的答案是3,因为2是1的两倍,4是2的两倍,18是9的两倍。 输入形式 输入...
小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述: ...对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。
- **题目描述**:给定一个整数数组,请求出两两之差绝对值最小的值。 - **解决方案**:可以先对数组进行排序,然后遍历相邻元素,计算它们之间的差值的绝对值,并记录最小值。 **2. 字符是否为整数及转换** - **...
数字字母特殊字符两两混合正则表达式1
在“数字字母特殊字符两两混合”的场景下,我们需要构建一个正则表达式来匹配满足特定条件的字符串。这个条件是每个字符都是数字、字母或特殊字符,并且它们必须两两交替出现。 首先,让我们理解一下什么是数字、...
这是一个非参数检验,用来检查多个独立样本的总体分布是否相同。SAS中可以通过`NPAR1WAY`过程执行Kruskal-Wallis检验。 2. **RANK和ANOVA结合**:对于两两比较,可以结合使用`RANK`和`ANOVA`过程。首先,使用`RANK`...
3. **去除重复值**:如果得到的差值中有重复的,则仅保留一个。 4. **计算不同差值的个数**:统计最终得到的不同差值的个数,记为\(D(t)\)。 5. **计算AC值**:最终的AC值计算公式为:\(AC值 = D(t) - (r - 1)\),...
在这个例子中,定义了一个整数数组`a`,然后使用两个嵌套循环,外层循环控制比较的趟数,内层循环进行两两比较并交换位置,直到数组完全排序。 3. **选择排序法**:选择排序是另一种基本的排序算法,它每次从未排序...
卡方检验是一个有用的统计方法,可以帮助我们判断多个样本率的差异。在本研究中,我们使用 SPSS 软件来进行卡方检验和两两比较,结果表明三个干预组之间存在显著差异。这项研究结果可以为临床医生和研究人员提供有...
* 题目 1:找出两两之差绝对值最小的值 这道题目考察候选人的数组操作能力和数学知识。 * 题目 2:写一个函数,检查字符是否是整数 这道题目考察候选人的字符串操作能力和函数设计能力。 * 题目 3:给出一个函数来...
1. 两两之差绝对值最小的值:此题考察数组处理和最优化问题。可以通过排序数组,然后计算相邻元素之间的差值,找到最小的差值。 2. 字符转整数函数:可以使用C++的`std::stoi`函数,或者自定义函数,通过遍历字符串...
在这个描述中,“给定n个正整数,请问它们两两之间的绝对值之差的和为多少?”是一个数学与计算机科学相结合的问题,它涉及到数组处理、循环、绝对值计算以及求和等基本概念。 首先,我们需要理解问题的核心:计算...
例如,计算(1,1)的值时,我们比较了序列s的第一个字符"A"与序列t的第一个字符"A",得到得分1,因此(1,1)的值是1。 接着,我们计算(1,2)的值,考虑所有可能的路径,最终选择得分最高的路径,即从(1,1)出发,得分是0...
机器学习基于R语言实现的十种回归算法源码使用loocv框架拟合出(两两结合,共180种组合,加上其本身)190种组合.zip机器学习基于R语言实现的十种回归算法源码使用loocv框架拟合出(两两结合,共180种组合,加上其本身)...
每个房间可以看作图中的一个节点,每扇门代表一个有方向的边,从一个节点指向另一个节点。 2. **数据结构选择**:可以选择使用邻接矩阵来表示这个有向图。邻接矩阵是一个二维数组,其中的元素表示节点之间的连接。...
这个函数接收一个整数数组arr和数组的长度n为参数,并对数组进行升序排序。通过使用两个嵌套的循环结构,本程序对数组中的元素两两比较,并交换它们的位置,直到所有元素被正确排序。 在main函数中,程序声明了一个...