chapter 1

2.如何用位逻辑运算来实现位向量?##

把bitmap存在int中,一个int32位,可以存32个数。

//
//  main.cpp
//  pearls
//
//  Created by YangKi on 15/11/26.
//  Copyright © 2015年 YangKi. All rights reserved.


#include <stdio.h>
#include <stdlib.h>
using namespace std;

#define SHIFT 5
#define MASK 0x1F
#define N 1000

int storage[1+N/32];

void set(int i){        storage[i>>SHIFT] |=  (1<<(i & MASK));  }
void clr(int i){        storage[i>>SHIFT] &= ~(1<<(i & MASK));  }
int test(int i){ return storage[i>>SHIFT] &   (1<<(i & MASK));  }

int main()
{
    int i;
    scanf("%d", &i);
    
    set(i);
    
    if(test(i))
    {
        printf("exist\n");
    }
    else
    {
        printf("not exist\n");
    }
    
    return 0;
}

4.如何生成不重复的随机整数?##

先把数字按照顺序放上去,再互相交换,打乱顺序。

for(int i=0; i<n; i++)
    a[i]=i;
for(int i=0; i<n; i++)
{
    pos=rand()%(n-i)+i // i<= pos <=n-1
    swap(i, pos); // 交换数组两个数
}

9.如何处理一个很少访问的巨大数组的初始化?##

假设有一个很大的数组data[N], 只会随机访问其中的几个数,如此一来,如果按照往常策略对其全部元素顺序进行初始化便会花费巨大的时间。如果此时我们有足够的空间,则我们可以用下面的方法来进行部分初始化,可以大大节约时间。to[]数组来存储data[]中已经初始化的元素,from[]数组来存储初始化元素在to[]中的index。

举个例子,要取data[3],to里面如果存着3这个值,表明已经初始化过,但如何快速的找到to里面的3。只要看from[3]中存储的值,该值就是to中存3的位置。

//
//  main.cpp
//  pearls
//
//  Created by YangKi on 15/11/26.
//  Copyright © 2015年 YangKi. All rights reserved.
//  常量时间初始化数组
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define ms 100
int data[ms]; //需要初始化的数组
int from[ms]; // from[i] 表示data[i]的i在to[]中的index
int to[ms]; //所有被初始化过的data元素的index都存在to[]中, 比如data[3]被初始化了,则3一定被存在to[]中
int top;

//判断是否被初始化过。
bool is_init(int i)
{
    return (from[i] < top && to[ from[i] ] == i);
}

int main(void)
{
    top = 0;
    //1. 这里生成一些随机数值。
    for (int i = 0; i < ms; ++i)
        data[i] = from[i] = to[i] = i;
    for (int i = 0; i < ms; ++i)
    {
        if (is_init(i))
        {
            printf("error");
        }
        int v = i + rand()%(ms - i );
        int t = data[i]; data[i] = data[v]; data[v] = t;
        
        v = i + rand()%(ms - i );
        t = from[i]; from[i] = from[v]; from[v] = t;
        
        v = i + rand()%(ms - i );
        t = to[i]; to[i] = to[v] ; to[v] = t;
    }  
    
    //2. 开始初始化
    for (int i = 0; i < ms; ++i)
    {
        if (is_init(i) == false)
        {
            data[i] = i;
            from[i] = top;
            to[top++] = i;
        }
    }
    
    for (int i = 0; i < ms; ++i)
    {
        if (!is_init(i))
        {
            printf("error: %d\n", i);
        }
    }
    return 0;
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,068评论 19 139
  • 机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 1) 注...
    Albert陈凯阅读 22,608评论 9 477
  • 往事如烟,心事如云,随风而起,随风而逝,经不起大风大浪,亦经不起微小波澜;伊人如芝,缘分如诗,随天而生,随地而灭,...
    钟离黎明阅读 1,180评论 0 0
  • 第二章 缓慢思维VS敏捷思维 思维在不停的跳跃,要想控制这条永不停歇的思维河流,让它为实现自己的目标服务,需要强大...
    Vicky_L阅读 3,663评论 0 0
  • 最近收了一个徒儿。 我们不去西天,也不去取经,但或许在人生路上可以互相取经。 她问我:师父,师母呢。你都这么大人了...
    十四先森阅读 3,077评论 0 0

友情链接更多精彩内容