给出一个顺序文件,它最多包含40亿个随机排列的32位整数 问题:找出一个不在文件中的32位整数。...

本文介绍了一种使用位操作和分治思想的算法,该算法能在有限的空间内高效地找到一个未出现在顺序文件中的32位整数。通过不断将数组分为两部分并选择较短的那一边继续搜索,最终定位到缺失的数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



package com.myway.study;

import java.util.ArrayList;
import java.util.List;

/**
* 给出一个顺序文件,它最多包含40亿个随机排列的32位整数

问题:找出一个不在文件中的32位整数。
* User: zhangyong
* Date: 14-5-17
* Time: 下午12:38
* To change this template use File | Settings | File Templates.
*/
public class BinarySearchNoExist {

public static Integer lostNum(int arr[], int len, int maxBits) {

List lostNumList = new ArrayList();

int lostNum = 0;

int MASK = 0;

int locZero = 0;

int locOne = 0;

int[] arrZero = new int[len];

int[] arrOne = new int[len];

for (int bit = maxBits - 1; bit >= 0; bit--) {

locOne = 0;
locZero = 0;

MASK = 1 << bit;
for (int i = 0; i < len; i++) {
if ((arr[i] & MASK) == MASK) {
arrOne[locOne++] = arr[i];
} else {
arrZero[locZero++] = arr[i];
}
}

if ((locOne == MASK) && (locZero == MASK)) {

} else {
if (locOne > locZero) {
arr = arrZero;
len = locZero;
} else {
lostNum += MASK;
arr = arrOne;
len = locOne;
}
}
}

return lostNum;
}

public static void main(String[] args) {
int[] arr = {4, 2, 3, 5, 7, 10, 9, 11, 12, 14};
System.out.println(lostNum(arr, arr.length, 4));
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值