363636

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/sem.h>

#include <string.h>

#define SHM_KEY 1234

#define SEM_KEY 5678

struct BufferPool

{

    char Buffer[5][100];

    int Index[5];

};

// 定义信号量操作结构体

struct sembuf sem_lock = {0, -1, SEM_UNDO};

struct sembuf sem_unlock = {0, 1, SEM_UNDO};

void producer(const char *inputFile)

{

    // 获取共享内存

    int shmid = shmget(SHM_KEY, sizeof(struct BufferPool), 0666);

    if (shmid == -1)

    {

        perror("shmget");

        exit(1);

    }

    struct BufferPool *buffer = (struct BufferPool *)shmat(shmid, NULL, 0);

    FILE *input = fopen(inputFile, "r");

    char line[100];

    // 获取信号量

    int semid = semget(SEM_KEY, 1, 0666);

    if (semid == -1)

    {

        perror("semget");

        exit(1);

    }

    while (fgets(line, sizeof(line), input) != NULL)

    {

        // 等待可用的缓冲区

        semop(semid, &sem_lock, 1);

        // 查找可用的缓冲区

        int i;

        for (i = 0; i < 5; i++)

        {

            if (buffer->Index[i] == 0)

                break;

        }

        // 写入数据到缓冲区

        strcpy(buffer->Buffer[i], line);

        buffer->Index[i] = 1;

        printf("Producer: Wrote \"%s\" to buffer %d\n", line, i);

        // 释放缓冲区的访问权

        semop(semid, &sem_unlock, 1);

    }

    fclose(input);

    shmdt(buffer);

}

int main()

{

    const char *inputFile = "input.txt";

    producer(inputFile);

    return 0;

}

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/sem.h>

#define SHM_KEY 1234

#define SEM_KEY 5678

struct BufferPool

{

    char Buffer[5][100];

    int Index[5];

};

// 定义信号量操作结构体

struct sembuf sem_lock = {0, -1, SEM_UNDO};

struct sembuf sem_unlock = {0, 1, SEM_UNDO};

void consumer(const char *outputFile)

{

    // 获取共享内存

    int shmid = shmget(SHM_KEY, sizeof(struct BufferPool), 0666);

    if (shmid == -1)

    {

        perror("shmget");

        exit(1);

    }

    struct BufferPool *buffer = (struct BufferPool *)shmat(shmid, NULL, 0);

    FILE *output = fopen(outputFile, "w");

    // 获取信号量

    int semid = semget(SEM_KEY, 1, 0666);

    if (semid == -1)

    {

        perror("semget");

        exit(1);

    }

    while (1)

    {

        // 等待可消费的缓冲区

        semop(semid, &sem_lock, 1);

        // 查找可消费的缓冲区

        int i;

        for (i = 0; i < 5; i++)

        {

            if (buffer->Index[i] == 1)

                break;

        }

        // 读取数据并写入输出文件

        fputs(buffer->Buffer[i], output);

        printf("Consumer: Read \"%s\" from buffer %d\n", buffer->Buffer[i], i);

        // 重置缓冲区状态

        buffer->Index[i] = 0;

        // 释放缓冲区的访问权

        semop(semid, &sem_unlock, 1);

        // 结束条件:如果所有缓冲区都已经被消费,则退出循环

        int allConsumed = 1;

        for (i = 0; i < 5; i++)

        {

            if (buffer->Index[i] == 1)

            {

                allConsumed = 0;

                break;

            }

        }

        if (allConsumed)

            break;

    }

    fclose(output);

    shmdt(buffer);

}

int main()

{

    const char *outputFile = "output.txt";

    consumer(outputFile);

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要将数据进行标准化处理,因为不同特征的取值范围不同。我们可以使用Z-score标准化方法将数据标准化为均值为0,标准差为1的正态分布。 标准化后的数据如下: ``` 是否购车 婚姻状况 绩效成绩 1 0.707107 -1.224745 1.019049 2 -1.414214 0.816497 0.090909 3 -1.414214 -1.224745 -1.383679 4 0.707107 0.816497 0.727273 5 -1.414214 1.224745 -0.363636 6 -1.414214 0.816497 -1.727273 ``` 接下来,我们可以使用K-means算法进行聚类。假设我们要将数据分为两类。 首先,随机初始化两个聚类中心,可以选择数据集中的两个点作为初始聚类中心。 初始聚类中心如下: ``` 是否购车 婚姻状况 绩效成绩 c1 0.707107 -1.224745 1.019049 c2 -1.414214 0.816497 0.090909 ``` 然后,计算每个数据点到这两个聚类中心的距离,可以选择曼哈顿距离(Manhattan distance)作为距离度量。 计算得到每个数据点到聚类中心的距离如下: ``` c1 c2 1 1.931851 0.707107 2 1.591584 1.931851 3 2.527310 0.000000 4 1.118034 2.121320 5 3.219203 1.118034 6 2.527310 1.591584 ``` 然后,将每个数据点分配到距离最近的聚类中心所在的簇中。 根据距离,将数据点分配到两个簇中: ``` 是否购车 婚姻状况 绩效成绩 簇 1 0.707107 -1.224745 1.019049 1 2 -1.414214 0.816497 0.090909 2 3 -1.414214 -1.224745 -1.383679 2 4 0.707107 0.816497 0.727273 1 5 -1.414214 1.224745 -0.363636 2 6 -1.414214 0.816497 -1.727273 2 ``` 接下来,计算每个簇的新聚类中心,即将簇内所有数据点的均值作为新的聚类中心。 计算得到新的聚类中心如下: ``` 是否购车 婚姻状况 绩效成绩 c1 0.707107 0.296167 0.873161 c2 -1.414214 0.605165 -0.657196 ``` 然后,重复以上步骤,计算每个数据点到新的聚类中心的距离,重新分配簇,并计算新的聚类中心,直到聚类中心不再发生变化或者达到预定的迭代次数。 重复以上步骤,直到聚类中心不再发生变化: ``` 是否购车 婚姻状况 绩效成绩 簇 1 0.707107 -1.224745 1.019049 1 2 -1.414214 0.816497 0.090909 2 3 -1.414214 -1.224745 -1.383679 2 4 0.707107 0.816497 0.727273 1 5 -1.414214 1.224745 -0.363636 2 6 -1.414214 0.816497 -1.727273 2 是否购车 婚姻状况 绩效成绩 c1 0.707107 0.296167 0.873161 c2 -1.414214 0.605165 -0.657196 是否购车 婚姻状况 绩效成绩 簇 1 0.707107 -1.224745 1.019049 1 2 -1.414214 0.816497 0.090909 2 3 -1.414214 -1.224745 -1.383679 2 4 0.707107 0.816497 0.727273 1 5 -1.414214 1.224745 -0.363636 2 6 -1.414214 0.816497 -1.727273 2 是否购车 婚姻状况 绩效成绩 c1 0.707107 0.296167 0.873161 c2 -1.414214 0.605165 -0.657196 ``` 最终,将数据分为两个簇,簇1包含记录号1和4,簇2包含记录号2、3、5和6。 簇1: ``` 是否购车 婚姻状况 绩效成绩 簇 1 0.707107 -1.224745 1.019049 1 4 0.707107 0.816497 0.727273 1 ``` 簇2: ``` 是否购车 婚姻状况 绩效成绩 簇 2 -1.414214 0.816497 0.090909 2 3 -1.414214 -1.224745 -1.383679 2 5 -1.414214 1.224745 -0.363636 2 6 -1.414214 0.816497 -1.727273 2 ``` 以上就是使用K-means算法进行聚类的详细步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值