《编程珠玑》之位图技术

2023-11-23 05:30
文章标签 技术 编程 之位 珠玑

本文主要是介绍《编程珠玑》之位图技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

编程珠玑,相当不错的一本书。其中很多金句需要在工作的过程当中,铭记于心:

chapter 1,书中的金典语句:

@1,明确问题(问对正确的问题),这场战役就成功了90%.

@2,几分钟的仔细研究可以大幅削减代码的长度、程序员的时间和程序系统运行的时间。

@3,设计者确定其设计已经达到了完美的标准,不是不能再增加任何东西,而是不能再减少任何东西。

@4,程序员的主要问题,与其说是技术问题,还不如说是心理问题:他不能解决问题,是因为他试图解决错误的问题。问题的最终解决,是通过打破他的概念壁垒,进而去解决一个较简单的问题而实现的。

 

明确问题:

解决实际的问题,首先是找到现实问题里面,包含的最本质的问题,然后加以提炼成更加清晰规范化的条件:

输入:文件包含最多10^7个正整数、每个正整数不大于10^7。并且数据均不重复,数据之间无关联。

输出:升序输出输入的列表

外部约束:约1MB的内存空间,目标是10秒钟运行完全。

作者讨论了该问题的几种解决方案,比较了几种方案的实现复杂度和性能。最终针对问题,选用了“结构简单、部件少、易于维护、非常坚固”的 位图方案 

这里附加自己的代码实现,关键还是在于位图技术的有效应用。

#include<stdio.h>
#include<assert.h>

#define BITMAP_SIZE 6
typedef unsigned int MAP_TYPE;
unsigned int g_map_item_size = 8*sizeof(MAP_TYPE);


/** \brief 使用位图对数组进行排序
 * \param arr:带排序数组,要求数组元素不重复,且为正整数。
 * \param size: 数组大小
 * \return 空
 */
void sort_unique_positive_integer(int *arr, unsigned int size)
{
    MAP_TYPE bitMap[BITMAP_SIZE];

    //step 1, bitMap init 0
    for(int i=0;i<BITMAP_SIZE;++i)
    {
        bitMap[i]=0;
    }

    //step 2, set bitMap bit value according to input value
    for(int i=0;i<size;++i)
    {
        int idx=arr[i]/g_map_item_size;
        int idxBit=arr[i]%g_map_item_size;
        assert(idx < BITMAP_SIZE);
        bitMap[idx] = (bitMap[idx] | (1<<idxBit));
    }

    //step 3,output result according to bitMap bit value
    for(int i=0;i<BITMAP_SIZE;++i)
    {
        for(int j=0;j<g_map_item_size;++j)
        {
            if(0 != ((bitMap[i])&(1<<j)))
            {
                printf("%d ",(g_map_item_size*i)+j);
            }
        }
    }
    printf("\n");
}


int main()
{

    int a[30]={4,5,7,13,47,45,23,44,16,8,33,24,27,28,0};
    sort_unique_positive_integer(a,30);

    return 0;
}

编程珠玑提供的代码,果然简洁:

这篇关于《编程珠玑》之位图技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)