Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519488
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: C/C++

2016-08-04 16:14:36

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
在一条直线上最多的点。
理解错了:理解成一条直线上距离最长的点(自己见过类似题,务必审题要细!!!!)

4.1 hash_map和map的区别在哪里?

构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数). 
存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其内存数据结构是不一样的。

4.2 什么时候需要用hash_map,什么时候需要用map?

总体来说,hash_map 查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n) 小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。

现在知道如何选择了吗?权衡三个因素: 查找速度, 数据量, 内存使用。

这里还有个关于hash_map和map的小故事,看看:http://dev.csdn.net/Develop/article/14/14019.shtm

4.3 如何在hash_map中加入自己定义的类型?
你只要做两件事, 定义hash函数,定义等于比较函数。下面的代码是一个例子:

-bash-2.05b$ cat my.cpp
#include 
#include 
#include

using namespace std;
//define the class
class ClassA{
    public:
        ClassA(int a):c_a(a){}
        int getvalue()const { return c_a;}
        void setvalue(int a){c_a=a;}
    private:
        int c_a;
};

//1 define the hash function
struct hash_A{
        size_t operator()(const class ClassA & A)const{
                // return hash(classA.getvalue());
                return A.getvalue();
        }
};

//2 define the equal function
struct equal_A{
        bool operator()(const class ClassA & a1, const class ClassA & a2)const{
                return a1.getvalue() == a2.getvalue();
        }
};

int main()
{
        hash_map hmap;
        ClassA a1(12);
        hmap[a1]="I am 12";
        ClassA a2(198877);
        hmap[a2]="I am 198877";
        
        cout<         cout<         return 0;
}
-bash-2.05b$ make my
c++ -O -pipe -march=pentiumpro my.cpp -o my
-bash-2.05b$ ./my
I am 12
I am 198877

4.4如何用hash_map替换程序中已有的map容器?

这个很容易,但需要你有良好的编程风格。建议你尽量使用typedef来定义你的类型: 
typedef map KeyMap;
当你希望使用hash_map来替换的时候,只需要修改:
typedef hash_map KeyMap;
其他的基本不变。当然,你需要注意是否有Key类型的hash函数和比较函数。

4.5为什么hash_map不是标准的?

具体为什么不 是标准的,我也不清楚,有个解释说在STL加入标准C++之时,hash_map系列当时还没有完全实现,以后应该会成为标准。如果谁知道更合理的解释,也希望告诉我。但我想表达的是,正是因为hash_map不是标准的,所以许多平台上安装了g++编译器,不一定有hash_map的实现。我就遇到了这样的例子。因此在使用这些非标准库的时候,一定要事先测试。另外,如果考虑到平台移植,还是少用为佳。

4.6 有学习使用hash_map的建议吗?

hash中文是哈希,也成为散列,听见别人说散列容器不要埋怨自己孤陋寡闻。了解hash系列,你还可以看看这篇文章:effective STL 25: 熟悉非标准散列容器, 另外建议查看源代码。如果还有问题,那么你可以在STL论坛上提问,会有高手回答你的。


点击(此处)折叠或打开

  1. /**
  2.  * Definition for a point.
  3.  * struct Point {
  4.  * int x;
  5.  * int y;
  6.  * Point() : x(0), y(0) {}
  7.  * Point(int a, int b) : x(a), y(b) {}
  8.  * };
  9.  */

  10. class Solution {
  11. public:
  12.     int maxPoints(vector<Point> &points) {
  13.         int size = points.size();
  14.         if(size == 0)
  15.             return 0;
  16.         else if(size == 1)
  17.             return 1;
  18.              
  19.         int ret = 0;
  20.         for(int i = 0;i<size;i++){
  21.              
  22.             int curmax = 1;
  23.             map<double,int>mp;
  24.             int vcnt = 0; //垂直点
  25.             int dup = 0; //重复点
  26.             for(int j = 0;j<size;j++){
  27.                  
  28.                 if(j!=i){
  29.                     double x1 = points[i].x - points[j].x;
  30.                     double y1 = points[i].y - points[j].y;
  31.                     if(x1 == 0 && y1 == 0){ //重复
  32.                         dup++;
  33.                     }else if(x1 == 0){ //垂直
  34.                         if(vcnt == 0)
  35.                             vcnt = 2;
  36.                         else
  37.                             vcnt++;
  38.                         curmax = max(vcnt,curmax);
  39.                     }else{
  40.                         double k = y1/x1; //斜率
  41.                         if(mp[k] == 0)
  42.                             mp[k] = 2;
  43.                         else
  44.                             mp[k]++;
  45.                         curmax = max(mp[k],curmax);
  46.                     }
  47.                 }
  48.             }
  49.             ret = max(ret,curmax+dup);
  50.         }
  51.         return ret;
  52.          
  53.     }
  54. };
阅读(717) | 评论(0) | 转发(0) |
0

上一篇:C小程序 - setbuf和setvbuf

下一篇:笔试题(2)

给主人留下些什么吧!~~