《编程珠玑》之位图技术

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

相关文章

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]