《编程珠玑》之位图技术

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

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议