জাভা স্ট্রিংয়ের কয়টি অক্ষর থাকতে পারে?


157

আমি স্পেয়ার অনলাইন জজ (এসপিওজে) থেকে দ্য নেক্সট প্যালিনড্রোম সমস্যাটি চেষ্টা করছি যেখানে আমার দশ মিলিয়ন অঙ্কের পূর্ণসংখ্যার জন্য প্যালিনড্রোম খুঁজে পেতে হবে। আমি স্ট্রিংগুলি বিপরীত করার জন্য জাভাটির ফাংশনগুলি ব্যবহার করার বিষয়ে ভেবেছিলাম, তবে তারা কোনও স্ট্রিংকে এই দীর্ঘ হতে দেবে?


আপনি কি বলছেন যে আপনাকে একটি ফাংশন লিখতে হবে যা প্যালিনড্রোমগুলি জেনারেট করে, যার আকার ব্যবহারকারী নির্দিষ্ট করে এবং দৈর্ঘ্যে 1 মিলিয়ন অক্ষর পর্যন্ত হতে পারে?
রবার্ট

3
সমস্যা (SPOJ থেকে) একটি 100Gigabyte ফাইল থাকতে পারে এবং আপনি একসাথে একটি স্ট্রিং মধ্যে এটি লোড করতে চান? সিরিয়াসলি ... দয়া করে একটি স্ক্যানার ব্যবহার করুন!
মারাত্মক

উত্তর:


242

আপনার দৈর্ঘ্যের একটি স্ট্রিং পেতে সক্ষম হওয়া উচিত

  1. Integer.MAX_VALUEসর্বদা 2,147,483,647 (2 31 - 1)
    (জাভা নির্দিষ্টকরণ দ্বারা সংজ্ঞায়িত, একটি অ্যারের সর্বাধিক আকার, যা স্ট্রিং ক্লাস অভ্যন্তরীণ স্টোরেজের জন্য ব্যবহার করে)
    বা

  2. Half your maximum heap size(যেহেতু প্রতিটি চরিত্র দুটি বাইট) যেটি ছোট


43
... বা আপনার সর্বোচ্চ
স্তরের

2
@ ChssPly76: হ্যাঁ, এটি সঠিক that's আমি আমার উত্তর সম্পাদনা করেছি, আপনাকে ধন্যবাদ।
বিল

2
আমি কীভাবে সর্বোচ্চ স্তরের আকার খুঁজে পাব? এছাড়াও, আমি জানি না যে বিচারক আমার সমস্যাটি পরীক্ষা করতে কোন জাভা ভার্চুয়াল মেশিনটি ব্যবহার করছেন এটি পূর্ণসংখ্যা। জেভিএম নির্ভর নির্ভরের অনুমানের অংশ?
andandandand

6
পূর্ণসংখ্যা.ম্যাক্স_ভ্যালু সর্বদা 2147483647 (2 ^ 31 - 1), এটি জাভা স্পেসিফিকেশনের অংশ।
সিডি 1

4
64৪-বিট জেভিএম ধরে নিচ্ছি, যেহেতু আপনার দৈর্ঘ্যের একটি স্ট্রিং সঞ্চয় করতে আপনার 8 গিগাবাইট ভার্চুয়াল মেমরি লাগবে।
রবার্ট ফ্রেজার

21

আমি বিশ্বাস করি যে তারা অভ্যন্তরীণ অ্যারে দ্বারা ধারণ করে এগুলি 2 ^ 31-1 অক্ষর পর্যন্ত হতে পারে এবং জাভাতে পূর্ণসংখ্যার দ্বারা অ্যারেগুলি সূচিত করা হয়।


অভ্যন্তরীণ বাস্তবায়ন অপ্রাসঙ্গিক - উদাহরণস্বরূপ, চরিত্রের ডেটা দীর্ঘস্থায়ী বিন্যাসে সংরক্ষণ করা যায় না তার কোনও কারণ নেই। সমস্যাটি হল ইন্টারফেসটি দৈর্ঘ্যের জন্য ints ব্যবহার করে। getBytesএবং যদি আপনি খুব বড় স্ট্রিংয়ের চেষ্টা করেন তেমনই সমস্যা হতে পারে।
টম হাটিন -

এটি সত্য - আমি সেই সত্যটি বোঝাচ্ছিলাম। আমার খারাপ।
অ্যাপার্কিনস

15

আপনি যখন তত্ত্বটি পূর্ণসংখ্যায় করতে পারেন। MAX_VALUE টি অক্ষর, JVM এটি ব্যবহার করতে পারে এমন অ্যারের আকারে সীমাবদ্ধ।

public static void main(String... args) {
    for (int i = 0; i < 4; i++) {
        int len = Integer.MAX_VALUE - i;
        try {
            char[] ch = new char[len];
            System.out.println("len: " + len + " OK");
        } catch (Error e) {
            System.out.println("len: " + len + " " + e);
        }
    }
}

ওরাকল জাভা 8 আপডেট 92 প্রিন্টে

len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit
len: 2147483645 OK
len: 2147483644 OK

দ্রষ্টব্য: জাভা 9-এ, স্ট্রিংগুলি বাইট ব্যবহার করবে [] যার অর্থ হবে যে মাল্টি-বাইট অক্ষর একাধিক বাইট ব্যবহার করবে এবং সর্বোচ্চ আরও কমিয়ে দেবে। আপনার যদি চারটি বাইট কোড পয়েন্ট যেমন ইমোজিস থাকে তবে আপনি কেবল প্রায় 500 মিলিয়ন অক্ষর পাবেন


2
জাভা 9 এর কমপ্যাক্ট স্ট্রিংগুলি লাতিন -1 বা ইউটিএফ -16 এনকোডিং ব্যবহার করে। কোনও পরিবর্তনশীল দৈর্ঘ্যের এনকোডিং নয়, তিনটি বাইট অক্ষর নেই।
আপনাঙ্গিন

@apangin "ইউটিএফ -8 এর মতো বিকল্প এনকোডিংগুলি ব্যবহার করা কোনও লক্ষ্য নয়" সংশোধনের জন্য আপনাকে ধন্যবাদ।
পিটার লরি

5

আপনি কি নিজের নম্বর ধরে রাখার BigDecimalপরিবর্তে ব্যবহার করার কথা বিবেচনা করেছেন String?


1
এটি সংখ্যাগুলির সাথে অ্যাপ্লিকেশনটি কী করবে তার উপর নির্ভর করে। যদি এটি প্যালিনড্রোমগুলি খুঁজে পাওয়া, গণনা (দশমিক) অঙ্কগুলি যেমন পাঠ্য জিনিসগুলি করতে চলেছে তবে একটি স্ট্রিং আরও ভাল। যদি এটি গাণিতিক কাজ করে চলেছে তবে একটি বিগডিসিমাল (বা বিগইন্টিজার) আরও ভাল।
স্টিফেন সি

সমস্যাটি হ'ল "প্রতিটি কে-এর জন্য, কে এর চেয়ে সবচেয়ে ছোট প্যালিনড্রোম আউটপুট দিন" " (যেখানে কে প্রদত্ত নম্বর। এটা তোলে জাভাস্ক্রিপ্টে গার্বেজ আউটপুট নিতান্তই সহজ হয়ে যাবে প্রথম ছোট কে তুলনায় আপনি এক কে উদাহরণ চেয়ে বড় এটি গাণিতিক প্রয়োজন যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে : পরবর্তী যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে 999999999999 চেয়ে বড় বা পরের যে শব্দ কবিতা প্রভৃতি উলটা করিয়া পড়িলেও একই থাকে 12922. চেয়ে বড় খুঁজুন
Thorbjørn Ravn অ্যান্ডারসনকে

4

পূর্ণসংখ্যা। MAX_VALUE আপনার মেমরির আকারের উপর নির্ভর করে স্ট্রিংয়ের সর্বোচ্চ আকার + তবে গোলকের অনলাইন বিচারকের ক্ষেত্রে সমস্যা আপনাকে সেই ফাংশনগুলি ব্যবহার করতে হবে না


3

স্ট্রিং.ভ্যালু সংরক্ষণ করার জন্য জাভা 9 বাইট ব্যবহার করে [], যাতে আপনি কেবল জাভা 9 এ প্রায় 1 জিবি স্ট্রিং পেতে পারেন। অন্যদিকে জাভা 8 এ 2 জিবি স্ট্রিং থাকতে পারে।

চরিত্র দ্বারা আমি "চর" বোঝাতে চাইছি, কিছু অক্ষর বিএমপিতে উপস্থাপনযোগ্য নয় (কিছু ইমোজির মতো), সুতরাং এটি আরও বেশি (বর্তমানে ২) অক্ষর গ্রহণ করবে।


4
আপনি জাভা -9 এর জন্য স্ট্রিং আকার 2 জিবি থেকে 1 জিবি সীমিত করার জন্য রেফারেন্স সংযুক্ত করতে পারেন
আদিত্য গুপ্ত

-1

বন্ধুরা, গাদা অংশটি আরও খারাপ হয়ে যায়। ইউটিএফ -16 16 বিটের মধ্যে সীমাবদ্ধ থাকার গ্যারান্টিযুক্ত নয় এবং 32 এ প্রসারিত হতে পারে


2
জাভা charটাইপ বাদে ঠিক 16 বিট, সুতরাং ইউটিএফ -16 ব্যবহারের বিট সংখ্যা সত্যিই কিছু যায় আসে না ...
awksp
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.